WINEDBG(1) Wine Developers Manual WINEDBG(1)

winedbg - اشکال‌زدای Wine

winedbg [ options ] [ program_name [ program_arguments ] | wpid ]

winedbg --gdb [ options ] [ program_name [ program_arguments ] | wpid ]

winedbg --auto wpid

winedbg --minidump [ file.mdmp ] wpid

winedbg file.mdmp

winedbg یک اشکال‌زدا برای Wine است. این ابزار امکانات زیر را فراهم می‌کند:

- اشکال‌زدایی برنامه‌های بومی Win32
- اشکال‌زدایی برنامه‌های Winelib
- جایگزینی مستقیم برای Dr Watson

winedbg می‌تواند در پنج حالت مختلف استفاده شود. اولین آرگومان برنامه تعیین‌کننده حالتی است که winedbg در آن اجرا خواهد شد.

بدون هیچ حالت صریحی، این حالت عملیاتی استاندارد winedbg است. winedbg به عنوان رابط کاربری (front end) برای کاربر عمل خواهد کرد.
ابزار winedbg به عنوان یک پراکسی برای gdb استفاده خواهد شد. gdb رابط کاربری برای مدیریت دستورها خواهد بود و winedbg تمام درخواست‌های اشکال‌زدایی را از gdb به APIهای Win32 بازگردانی (proxy) خواهد کرد.
این حالت زمانی استفاده می‌شود که winedbg در مدخل رجیستری AeDebug به عنوان اشکال‌زدای پیش‌فرض تنظیم شده باشد. در این صورت، winedbg اطلاعات اولیه‌ای دربارهٔ یک خرابی یا فروپاشی (crash) نمایش می‌دهد. این حالت برای کاربرانی مفید است که قصد اشکال‌زدایی خرابی را ندارند، بلکه می‌خواهند اطلاعات مربوط به خرابی را جهت ارسال به توسعه‌دهندگان جمع‌آوری کنند.
این حالت مشابه حالت --auto است، با این تفاوت که به جای چاپ اطلاعات بر روی صفحه نمایش (همانند کاری که --auto انجام می‌دهد)، اطلاعات در یک فایل minidump ذخیره می‌شود. نام فایل یا از طریق خط فرمان ارسال می‌شود یا در صورت مشخص نشدن، توسط WineDbg تولید می‌گردد. این فایل بعداً می‌تواند برای بررسی بیشتر دوباره در winedbg بارگذاری شود.
در این حالت، winedbg وضعیت فرآیند تحت اشکال‌زدایی (debuggee) را که در یک فایل minidump ذخیره شده است، دوباره بارگذاری می‌کند. دستور minidump در ادامه یا حالت --minidump را ببینید.

در حالت default، گزینه‌های زیر در دسترس هستند:

winedbg دستور string را طوری اجرا می‌کند که گویی در خط فرمان winedbg تایپ شده است، و سپس خارج می‌شود. این ویژگی می‌تواند برای دریافت pid فرآیندهای در حال اجرا مفید باشد (winedbg --command "info proc").
نام فایل اجرایی را بدون شروع اجرای آن تنظیم می‌کند.
winedbg فهرست دستورهای موجود در فایل filename را طوری اجرا می‌کند که گویی در خط فرمان winedbg وارد شده‌اند، و سپس خارج می‌شود.

در حالت پراکسی gdb، گزینه‌های زیر در دسترس هستند:

برنامهٔ gdb را مستقیماً اجرا نکن؛ در عوض، دستور target remote مربوط به GDB را برای اجرا چاپ کن و منتظر اتصال از هر اشکال‌زدای سازگار با GDB بمان. به طور معمول، --gdb هم کارساز پراکسی اشکال‌زدایی و هم یک نمونه از gdb را برای رابط کاربری راه‌اندازی می‌کند. این گزینه به winedbg دستور می‌دهد تا از اجرای gdb صرف‌نظر کند و در عوض دستوری از GDB را که می‌توان برای اتصال دستی به کارساز استفاده کرد، چاپ نماید. این دستور به این صورت است:
target remote localhost:<port>

که در آن <port> درگاه TCP است که کارساز پراکسی اشکال‌زدایی winedbg به آن متصل شده است.

این گزینه به کاربر امکان می‌دهد gdb را با واسط کاربری اشکال‌زدایی دیگری مانند ddd، kgdb، gdbgui یا Qt Creator جایگزین کند. بدون در نظر گرفتن اینکه --no-start مشخص شده باشد یا خیر، winedbg پس از قطع شدن اولین اتصال (برای مثال، هنگامی که gdb از فرآیند تحت اشکال‌زدایی جدا می‌شود) خارج خواهد شد.
کارساز پراکسی اشکال‌زدایی GDB را روی درگاه مشخص‌شده راه‌اندازی می‌کند. اگر این گزینه مشخص نشده باشد، winedbg به سیستم‌عامل اجازه می‌دهد تا هر درگاه در دسترسی را انتخاب کند. این گزینه می‌تواند همراه با --no-start برای تعیین درگاهی که کارساز باید به آن متصل شود استفاده شود.
این گزینه رابط کاربری gdb را به جای استفاده از ترمینال فعلی یونیکس، در یک پنجرهٔ جدید xterm(1) اجرا می‌کند. در صورت مشخص شدن --no-start، این گزینه نادیده گرفته می‌شود.

در تمام حالت‌ها، بخش باقی‌ماندهٔ خط فرمان (در صورت ارسال) برای مشخص کردن برنامه‌ای که قرار است اشکال‌زدایی شود، به کار می‌رود:

نام یک فایل اجرایی برای شروع یک نشست اشکال‌زدایی است. winedbg در عمل با استفاده از این فایل اجرایی یک فرآیند ایجاد می‌کند. اگر program_arguments نیز ارائه شده باشند، به عنوان آرگومان‌های ایجاد فرآیند تحت اشکال‌زدایی استفاده خواهند شد.
winedbg به فرآیندی که pid ویندوزی آن wpid است، متصل خواهد شد. از دستور info proc درون winedbg برای فهرست کردن فرآیندهای در حال اجرا و pidهای ویندوزی آن‌ها استفاده کنید.
اگر چیزی مشخص نشده باشد، بدون اجرای هیچ برنامه‌ای و بدون اتصال به هیچ فرآیندی وارد اشکال‌زدا می‌شوید. باید خودتان مراحل لازم را انجام دهید..SH "دستورات (COMMANDS)"

بیشتر دستورات به‌کاررفته در winedbg مشابه دستورات gdb هستند. لطفاً برای جزئیات بیشتر به مستندات gdb مراجعه کنید. بخش gdb differences را در ادامه برای فهرستی از تفاوت‌ها با دستورات gdb ببینید.

دستورات متفرقه

دیباگر را ساقط (بی‌درنگ متوقف) می‌کند.
از دیباگر خارج می‌شود.

مدیریت فرآیند

به یک فرآیند Wine متصل می‌شود (N شناسه ویندوزی آن، به صورت عددی یا هگزادسیمال است). شناسه‌ها را می‌توان با استفاده از دستور info process به دست آورد. توجه داشته باشید که دستور info process مقادیر را به صورت هگزادسیمال برمی‌گرداند.
وضعیت برنامه در حال دیباگ را از فایل minidump با نام file.mdmp بارگذاری مجدد می‌کند. برای ذخیره چنین فایلی دستور minidump را ببینید.
از فرآیند فعلی Wine جدا می‌شود. فرآیند دیگر توسط WineDbg دیباگ نمی‌شود، اما همچنان در حال اجرا باقی می‌ماند (برای اهداف زنده).
فرآیند فعلی Wine را خاتمه می‌دهد (می‌کشد). فرآیند دیگر توسط WineDbg دیباگ نمی‌شود و همچنین متوقف می‌گردد (برای اهداف زنده).
زمینه (context) دیباگ فرآیند تحت دیباگ را در یک فایل minidump به نام file.mdmp ذخیره می‌کند.
همان فرآیند را با همان آرگومان‌ها مجدداً اجرا می‌کند. توجه: تمامی نقاط توقف (breakpoints) فرآیند قبلی دیگر در دسترس نخواهند بود.
همان فرآیند را با آرگومان‌های arg1 arg2... مجدداً اجرا می‌کند. توجه: تمامی نقاط توقف فرآیند قبلی دیگر در دسترس نخواهند بود.
ریسه (thread) فعلی را به N تغییر می‌دهد (N شناسه TID ویندوزی آن، به صورت عددی یا هگزادسیمال است).

دستورات راهنما

راهنمایی درباره دستورات چاپ می‌کند.
راهنمایی درباره دستورات info چاپ می‌کند.

دستورات کنترل جریان

اجرا را تا نقطه توقف یا استثنای (exception) بعدی ادامه می‌دهد.
رویداد استثنا را به زنجیره فیلترها (filter chain) ارسال می‌کند.
اجرا را تا خط بعدی کد C ادامه می‌دهد (وارد فراخوانی تابع می‌شود).
اجرا را تا خط بعدی کد C ادامه می‌دهد (وارد فراخوانی تابع نمی‌شود).
دستورالعمل اسمبلی بعدی را اجرا می‌کند (وارد فراخوانی تابع می‌شود).
دستورالعمل اسمبلی بعدی را اجرا می‌کند (وارد فراخوانی تابع نمی‌شود).
اجرا را تا رسیدن به بازگشت (return) تابع فعلی ادامه می‌دهد.

دستورات cont، step، next، stepi و nexti می‌توانند با یک عدد (N) پسوند شوند، به این معنا که پیش از بازگرداندن کنترل به کاربر، دستور باید N بار اجرا شود.

نقاط توقف، نقاط نظارت (Breakpoints, watchpoints)

نقطه (توقف|نظارت) شماره N را فعال می‌کند.
نقطه (توقف|نظارت) شماره N را غیرفعال می‌کند.
نقطه (توقف|نظارت) شماره N را حذف می‌کند.
هرگونه شرط موجود برای نقطه (توقف|نظارت) شماره N را حذف می‌کند.
شرط expr را به نقطه (توقف|نظارت) شماره N اضافه می‌کند. عبارت expr هر بار که به نقطه (توقف|نظارت) برخورد شود ارزیابی خواهد شد. اگر نتیجه ارزیابی صفر باشد، نقطه توقف تحریک نمی‌شود.
یک نقطه توقف در آدرس N اضافه می‌کند.
یک نقطه توقف در آدرس نماد id اضافه می‌کند.
یک نقطه توقف در خط N درون نماد id اضافه می‌کند.
یک نقطه توقف در خط N از فایل مبدأ فعلی اضافه می‌کند.
یک نقطه توقف در آدرس فعلی $PC اضافه می‌کند.
یک دستور نظارت (هنگام نوشتن) در آدرس N (به طول ۴ بایت) اضافه می‌کند.
یک دستور نظارت (هنگام نوشتن) در آدرس نماد id اضافه می‌کند. اندازه به اندازه نماد id بستگی دارد.
یک دستور نظارت (هنگام خواندن) در آدرس N (به طول ۴ بایت) اضافه می‌کند.
یک دستور نظارت (هنگام خواندن) در آدرس نماد id اضافه می‌کند. اندازه به اندازه نماد id بستگی دارد.
فهرستی از تمامی نقاط (توقف|نظارت) را (همراه با وضعیت آن‌ها) نمایش می‌دهد.

می‌توانید از نماد EntryPoint برای اشاره به نقطه ورود Dll استفاده کنید.

هنگام تنظیم یک نقطه (توقف|نظارت) با id، اگر نماد پیدا نشود (برای مثال، نماد در ماژولی باشد که هنوز بارگذاری نشده است)، winedbg نام نماد را به خاطر سپرده و هر بار که ماژول جدیدی بارگذاری شود برای تنظیم نقطه توقف تلاش می‌کند (تا زمانی که موفق شود).

دست‌کاری پشته (Stack)

پشته فراخوانی ریسه فعلی را چاپ می‌کند.
پشته فراخوانی ریسه با شناسه N را چاپ می‌کند. توجه: این کار موقعیت فریم فعلی را که توسط دستورهای up و dn تغییر می‌کند، عوض نمی‌کند.
در پشته ریسه فعلی یک فریم به بالا می‌رود.
در پشته ریسه فعلی به اندازه N فریم به بالا می‌رود.
در پشته ریسه فعلی یک فریم به پایین می‌آید.
در پشته ریسه فعلی به اندازه N فریم به پایین می‌آید.
فریم شماره N را به عنوان فریم فعلی برای پشته ریسه فعلی تنظیم می‌کند.
اطلاعات مربوط به متغیرهای محلی را برای فریم تابع فعلی چاپ می‌کند.

مدیریت دایرکتوری و فایل مبدأ

فهرست دایرکتوری‌هایی را که فایل‌های مبدأ در آن‌ها جستجو می‌شوند چاپ می‌کند.
مسیر pathname را به فهرست دایرکتوری‌های جستجوی فایل‌های مبدأ اضافه می‌کند.
فهرست دایرکتوری‌های جستجوی فایل‌های مبدأ را پاک می‌کند.
فایل تعریف نماد خارجی pathname را بارگذاری می‌کند.
فایل تعریف نماد خارجی pathname را بارگذاری می‌کند (با اعمال یک آفست N بر روی آدرس‌ها).
۱۰ خط مبدأ را رو به جلو از موقعیت فعلی فهرست می‌کند.
۱۰ خط مبدأ را رو به عقب از موقعیت فعلی فهرست می‌کند.
۱۰ خط مبدأ را از خط N در فایل فعلی فهرست می‌کند.
۱۰ خط مبدأ را از خط N در فایل pathname فهرست می‌کند.
۱۰ خط مبدأ از تابع id را فهرست می‌کند.
۱۰ خط مبدأ را از آدرس N فهرست می‌کند.

می‌توانید برای تغییر مقدار ۱۰ خط، محدوده انتهایی را با استفاده از جداکننده ',' مشخص کنید. به عنوان مثال:

خطوط مبدأ را از خط ۱۲۳ تا ۲۳۴ در فایل فعلی فهرست می‌کند.
خطوط مبدأ را از خط ۱ تا ۵۶ در فایل foo.c فهرست می‌کند.

نمایش‌ها (Displaying)

یک display (نمایشگر) عبارتی است که پس از اجرای هر دستور winedbg ارزیابی شده و مقدار آن چاپ می‌شود.

فهرست نمایش‌های فعال را نمایش می‌دهد.
یک نمایش برای عبارت expr اضافه می‌کند.
یک نمایش برای عبارت expr اضافه می‌کند. چاپ عبارت expr ارزیابی‌شده با استفاده از قالب ارائه‌شده انجام می‌شود (برای اطلاعات بیشتر درباره قالب‌ها به print command مراجعه کنید).
نمایش شماره N را حذف می‌کند.

دیس‌اسمبلی (Disassembly)

از موقعیت فعلی دیس‌اسمبل می‌کند.
از آدرس expr دیس‌اسمبل می‌کند.
کدهای بین آدرس‌های مشخص‌شده توسط دو عبارت را دیس‌اسمبل می‌کند.

حافظه (خواندن، نوشتن، نوع‌بندی)

حافظه را در آدرس expr بازبینی می‌کند.
حافظه را در آدرس expr با استفاده از قالب fmt بازبینی می‌کند.
مقدار expr را چاپ می‌کند (احتمالاً با استفاده از نوع آن).
مقدار expr را چاپ می‌کند (احتمالاً با استفاده از نوع آن).
مقدار عبارت expr را در متغیر var می‌نویسد..IP whatis expr نوع C عبارت expr را چاپ می‌کند
یا به‌صورت letter است یا count letter، که در آن letter می‌تواند یکی از موارد زیر باشد:
یک رشته ASCII
یک رشته یونیکد UTF16
دستورالعمل‌ها (دیس‌اسمبل)
عدد صحیح هگزادسیمال ۳۲ بیتی بدون علامت
عدد صحیح ده‌دهی ۳۲ بیتی علامت‌دار
عدد صحیح هگزادسیمال ۱۶ بیتی بدون علامت
نویسه (تنها مقادیر قابل چاپ 0x20-0x7f عملاً چاپ می‌شوند)
عدد صحیح هگزادسیمال ۸ بیتی بدون علامت
شناسه Win32 GUID

عبارت‌ها

عبارت‌ها در دیباگر Wine عمدتاً به سبک زبان C نوشته می‌شوند. با این حال، چند تفاوت وجود دارد:

شناسه‌ها می‌توانند نویسه '!' را در نام خود داشته باشند. این قابلیت عمدتاً امکان تعیین پیمانه‌ای که شناسه باید در آن جستجو شود را فراهم می‌کند؛ مانند USER32!CreateWindowExA.

در عملیات تبدیل نوع (cast)، هنگام مشخص کردن یک struct یا union، باید از کلمه کلیدی struct یا union استفاده کنید (حتی اگر برنامه شما از یک typedef استفاده کند).

هنگام مشخص کردن یک شناسه، اگر چندین نماد با این نام وجود داشته باشد، دیباگر برای نمادی که می‌خواهید استفاده کنید از شما سوال خواهد کرد. نماد مورد نظر خود را از روی شماره آن انتخاب کنید.

اطلاعات درباره سازوکارهای داخلی Wine

تمام کلاس‌های Windows ثبت‌شده در Wine را فهرست می‌کند
اطلاعات مربوط به کلاس ویندوز id را چاپ می‌کند
تمام کتابخانه‌های پویای بارگذاری‌شده در برنامه دیباگ‌شونده (شامل فایل‌های .so و DLLهای NE و PE) را فهرست می‌کند
اطلاعات مربوط به پیمانه واقع در نشانی N را چاپ می‌کند
مقدار ثبات‌های پردازنده (CPU) را چاپ می‌کند
مقدار ثبات‌های CPU و ممیز شناور (Floating Point) را چاپ می‌کند
تمام سگمنت‌های تخصیص‌یافته را فهرست می‌کند (فقط i386)
اطلاعات مربوط به سگمنت N را چاپ می‌کند (فقط i386)
مقادیر بالای پشته (stack) را چاپ می‌کند
تمام نگاشت‌های مجازی استفاده‌شده توسط برنامه دیباگ‌شونده را فهرست می‌کند
تمام نگاشت‌های مجازی استفاده‌شده توسط برنامه با pid ویندوزی N را فهرست می‌کند
سلسله‌مراتب پنجره‌ها را با شروع از پنجره میزکار نمایش می‌دهد
اطلاعات پنجره با دستگیره (handle) N را چاپ می‌کند
تمام w-processها را در نشست Wine فهرست می‌کند
تمام w-threadها را در نشست Wine فهرست می‌کند
فریم‌های استثنا را فهرست می‌کند (با شروع از فریم پشته کنونی). همچنین می‌توانید به‌عنوان یک آرگومان اختیاری، یک شناسه رشته را (به‌جای رشته کنونی) برای بررسی فریم‌های استثنای آن ارسال کنید.

پیام‌های اشکال‌زدایی (دیباگ) را می‌توان در حین دیباگ با استفاده از دستور set فعال و غیرفعال کرد، اما تنها برای کانال‌هایی که با متغیر محیطی WINEDEBUG مقداردهی اولیه شده‌اند.

پیام‌های warn را در کانال win فعال می‌کند
پیام‌های warn/fixme/err/trace را در کانال win فعال می‌کند
پیام‌های warn/fixme/err/trace را در کانال win غیرفعال می‌کند
کلاس fixme را در تمام کانال‌ها غیرفعال می‌کند

برای مشاهده تمامی دستورهای gdb به مستندات gdb مراجعه کنید.

با این حال، چند افزونه Wine از طریق دستور monitor در دسترس است:

تمام پنجره‌ها را در نشست Wine فهرست می‌کند
تمام پردازه‌ها را در نشست Wine فهرست می‌کند
نگاشت حافظه پردازه دیباگ‌شونده را نمایش می‌دهد

از آنجا که امکان ورودی کاربر وجود ندارد، هیچ دستوری در دسترس نیست.

هنگامی که در حالت پروکسی gdb استفاده می‌شود، WINE_GDB نام (و مسیر) فایل اجرایی مورد استفاده برای gdb را مشخص می‌کند. به‌طور پیش‌فرض از «gdb» استفاده می‌شود.

نسخه نخست توسط Eric Youngdale نوشته شده است.

برای مشاهده سایر مشارکت‌کنندگان، فهرست توسعه‌دهندگان Wine را ببینید.

اشکالات را می‌توان در سامانه ردیابی باگ Wine گزارش کرد..SH "دسترس‌پذیری (AVAILABILITY)" winedbg بخشی از توزیع Wine است که از طریق WineHQ، مرکز توسعه Wine، در دسترس است.

wine(1),
مستندات و پشتیبانی Wine.

October 2005 Wine 11.17