| DWARFDUMP() | DWARFDUMP() |
(NAME)'>نام (NAME)
dwarfdump - استخراج و نمایش اطلاعات اشکالزدایی DWARF در یک شیء ELF
خلاصه دستور (SYNOPSIS)
dwarfdump [گزینهها] نامفایلشیء
توضیحات (DESCRIPTION)
دستور dwarfdump بخشهای DWARF را بنا به گزینههای مشخصشده چاپ یا بررسی میکند. بدون هیچ گزینهای (اما با درج آرگومان الزامی نامفایلشیء)، تمام بخشها چاپ میشوند (البته برخی بخشها را نمیتوان بهطور مستقل و ایمن چاپ کرد، بنابراین آن بخشها تنها در آفستهایی چاپ میشوند که بخش .debug_info به آنها ارجاع داده باشد).
برای فایلهای شیء با ساختار split-dwarf (در DWARF5)، بخش Split Object Files در استاندارد DWARF5 بخش 7.3 را ببینید.
تقریباً تمامی گزینهها در هر دو حالت سنتی (تکحرفی) و حالت بلند با نامهای معنادار در دسترس هستند. گزینههای جدید تنها به فرم بلند ارائه میشوند.
در صورت عدم تعیین هیچ گزینهای، dwarfdump مجموعهای پایه از اطلاعات بخشهای DWARF را چاپ میکند. اگر هر گزینهای در خط فرمان مشخص شود، مجموعه پایه نادیده گرفته میشود و کاربر باید به dwarfdump مشخص کند چه چیزی را چاپ یا بررسی کند (به عنوان مثال با افزودن گزینه -a).
گزینههای چاپ و گزینههای بررسی متقابلاً مانعهالجمع هستند (اگر گزینههای بررسی انتخاب شوند، جزئیات بخشها چاپ نمیشوند). در صورت مواجهه با خطا، dwarfdump تلاش میکند بستر و زمینه کافی چاپ کند تا بتوان دقیقاً محل وقوع خطا در DWARF را متوجه شد. این تغییر، بررسی فایلهای شیء بسیار حجیم را بسیار سادهتر میسازد.
فرمت خروجی به گونهای طراحی شده که برای انسان خوانا باشد. اگر اسکریپتی قرار است خروجی را پردازش کند، گزینه --format-dense (-d) مفید خواهد بود.
عبارتهای DWARF تجزیه شده تا هر عبارت (برای مثال DW_OP_plus) در یک بلوک روی یک خط جداگانه چاپ شود. برای بازگرداندن رفتار قبلی که شبیه به --format-dense است اما تنها روی بلوکهای عملگرهای عبارت DWARF اعمال میشود (DW_OP*)، گزینه --format-expr-ops-joined مفید است. اگر این گزینه در فایل dwarfdump.conf قرار داده شود (برای فرمت آن به خود فایل مراجعه کنید)، بدون نیاز به درج آن در خط فرمان اعمال خواهد شد.
تمامی بخشها لزوماً در هر فایل شیء مفروضی وجود ندارند.
قالب خروجی ممکن است از یک نگارش به نگارش دیگر تغییر کند، بنابراین اتکای بیش از حد به فرمت خروجی توصیه نمیشود.
اطلاعات فریم (.debug_frame و .eh_frame) به شدت وابسته به ABI/ISA فایل شیء است. به صورت پیشفرض از مجموعهای عمومی از نامهای ثباتها (رجیسترها) استفاده میشود که تا ۱۰۰ رجیستر به نامهای r0-r99 را مدیریت میکند.
سه روش مختلف وجود دارد که توسعهدهندگان کامپایلر اطلاعات DWARF را از فایل اجرایی یا شیء اشتراکی تفکیک میکنند: یکی DWARF5 Split Dwarf است (گزینه --file-tied برای این موارد کاربردی است). روش دیگر GNU debuglink است (libdwarf به صورت خودکار هنگامی که نام فایل اجرایی داده میشود DWARF را پیدا میکند؛ از --no-follow-debuglink برای غیرفعال کردن این رفتار و فراهم شدن امکان چاپ دادههای ردگیری بازگشتی در بخش .eh_frame استفاده کنید). روش سوم در macOS است: اطلاعات اشکالزدایی DWARF در یک شیء جداگانه قرار دارد (dwarfdump/libdwarf در صورت وجود به صورت خودکار آن را پیدا میکنند و --no-follow-debuglink این جستجو را متوقف میکند). همچنین --suppress-debuglink-crc را ببینید.
در بسیاری از موارد میتوان با تعیین -v جزئیات بیشتری به دست آورد (گاهی -v -v جزئیات باز هم بیشتری ارائه میدهد؛ توضیحات مربوط به --verbose را در ادامه ببینید). هنگام چاپ DIEها (ورودیهای اطلاعات اشکالزدایی)، گزینههای -G (نمایش آفستهای سراسری) و -M (نامگذاری DW_FORM* ویژگیها) یا معادلهای -- آنها میتوانند کمک شایانی به درک DWARF نمایند.
گزینه --format-registers (-R) از مجموعه نامهای رجیستر عمومی تعبیهشده استفاده میکند که تا ۱۲۰۰ رجیستر به نامهای r0-r1199 را پوشش میدهد.
توضیحات گزینه --file-abi=<abi> (-x abi=<abi>) در ادامه نشان میدهد که چگونه یک abi را نامگذاری کرده و از آن برای هدایت پردازش --print-frame (-f) یا --print-eh-frame (-F) استفاده کنید.
استفاده از یکی از گزینههای --print-frame (-f) یا --print-eh-frame (-F) به معنای گنجاندن مقادیر زیادی از جزئیات abi (نام رجیسترها، تعداد رجیسترها) در خروجی است، اما بخشهای دیگری غیر از بخشهای فریم نیز ممکن است به نام رجیسترها نیاز داشته باشند.
مگر در مواردی که پردازنده فایل شیء مورد بررسی رجیسترهای زیادی داشته باشد، از گزینههای --format-registers یا -file-abi=<abi> استفاده نکنید؛ زیرا این گزینهها میتوانند استخراج بخشهای فریم را بیجهت کند کنند. در عوض از abi صحیح (در صورت وجود در dwarfdump.conf) یا یک گزینه عمومی نظیر --file-abi=abi=generic100 یا --file-abi=abi=generic500 استفاده کنید.
مفیدترین انتخابهای abi احتمالاً mips، x86، x86_64، ppc یا arm هستند. بدون گزینه --format-registers (-R) یا -file-abi=<abi> (-x abi=<abi>) دستور dwarfdump از مجموعهای عمومی و تعبیهشده از نامهای رجیستر استفاده میکند. اگر گزینه --file-name=<path> (-x name=<path>) مشخص نشود، dwarfdump مسیرهای "./dwarfdump.conf"، "$HOME/dwarfdump.conf"، "$HOME/.dwarfdump.conf" و "<install-prefix>/lib/dwarfdump.conf" را جستجو کرده و اولین فایلی را که بیابد به کار میگیرد. از گزینه --show-dwarfdump-conf برای مشاهده فایلهای پیدا شده توسط dwarfdump استفاده کنید. اگر یک یا چند گزینه --file-name=<path> (-x name=<path>) داده شود، آخرین آنها اعمال شده و تمامی فایلهای دیگر نادیده گرفته میشوند.
بررسی خطا (ERROR CHECKING)
برخی از گزینههای بررسی (مانند -k) (بخش "Check DWARF Integrity" در پیام راهنما را ببینید) خطاهای به اصطلاح بیضرر (harmless errors) را چاپ میکنند. اینها خطاهای کامپایلری هستند که مشکلی شناختهشده ایجاد نمیکنند و تنها درون خود libdwarf شناسایی میشوند. گزارش صحیح این خطاها در dwarfdump دشوار است و رشتههای خطا ممکن است نزدیک به زمان وقوع خطا ظاهر نشوند.
اگر یک یا چند صفت اختصاری در فهرست اختصارات برای یک ورودی اطلاعات اشکالزدایی (DIE) تکراری باشند (که نقض مستقیم استاندارد DWARF است)، افزودن گزینه --no-dup-attr-check به گزینهها به شما امکان میدهد با تغییر یک فلگ درونی در libdwarf مجموعه ویژگیهای معیوب را مشاهده کنید. میتوان از گزینه -kD برای آگاهی از ویژگیهای تکراری موجود در فایل شیء استفاده کرد.
اگر روی بخشهای DWARF در فایل شیء مورد خواندن از فشردهسازی zlib استفاده شده باشد، نامهای واقعی بخشها مانند .zdebug_info و غیره توسط dwarfdump گزارش خواهند شد. هنگامی که dwarfdump اعلام میکند موردی در آفست ۵۵ از .zdebug_info (یا مشابه آن) قرار دارد، به یاد داشته باشید که آفست مربوط به بخش غیرفشرده (در حافظه) است، نه بخش فشردهشده .zdebug_ در نامفایلشیء.
رشتههای ورودی با سبک URI (URI-STYLE INPUT STRINGS)
آرگومان <objectfilename> و تمامی گزینههایی که رشتههای نام را دریافت میکنند، ساختارهای URI را بررسی کرده و به صورت پیشفرض رشتههای URI را به نویسهها تبدیل میکنند. بنابراین هر نویسه تک % به گونهای رفتار میشود که گویی دو نویسه بعدی ارقام هگزادسیمال نشاندهنده نویسه واقعی هستند. نویسههای گوناگونی برای شلها (مانند bash یا sh) و برای getopt معنادار هستند (مانند نویسه فاصله). اگر تبدیل URI تغییری ایجاد کند، وضعیت قبل و بعد از تبدیل URI را در خروجی استاندارد چاپ میکند؛ بنابراین بررسی خطوط ابتدایی خروجی نشان میدهد که تبدیل URI کاری انجام داده است یا خیر. فرض میشود خود گزینهها از نوع غیر URI هستند. بنابراین در گزینه --format-producer=S&T (-cS&T) نویسه & ممکن است مشکلاتی در ورودی ایجاد کند، لذا باید بهجای آن از --format-producer=S%26T استفاده شود. برای وارد کردن واقعی یک نویسه % تک (به عنوان مثال در یک نام)، آن را در خط فرمان به %% دو برابر کنید (یا از %25 استفاده کنید).
گزینههای --format-suppress-uri (-U) (غیرفعال کردن تفسیر URI) و --format-suppress-uri-msg (-q) (بیصدا کردن یافتن توالیهای URI) کنترل دقیقتری روی تفسیر URI فراهم میکنند.
به عنوان مثال، برای به دست آوردن رشته 'a b' رشته را به صورت 'a%20b' بنویسید (در اینجا کوتیشن ' صرفاً برای نمایش است و جزئی از رشته نیست، هرچند کوتیشن مسلماً در نامها دردسرساز است). بهجای اسکیپ کردن علامت نقلقول " در رشته، عبارت %25 را تایپ کنید؛ برای مثال 'a "b' باید بهصورت 'a%20%25b' نوشته شود. هر نویسهای را میتوان به سبک URI نوشت، نه فقط نویسههایی که برای پوسته یا getopt مشکلساز هستند. اکیداً توصیه میکنیم در جاهایی که نیازی نیست از نویسههای سبک URI استفاده نکنید و از خود نویسه % در رشتههای خط فرمان استفاده ننمایید مگر اینکه ناچار باشید.
خروجی با سبک URI (URI-STYLE OUTPUT)
دستور dwarfdump هر نویسهای را در رشتهها که نویسه معمولی اسکی قابلچاپ نباشد (و برخی که اسکی هستند) به صورت معکوس بخش قبل تبدیل میکند. خروجی را به سبک uri در قالب xx% چاپ میکند که در آن xx ارقام هگزادسیمال اسکی 0-9a-f هستند. نویسه درصد (%) به صورت '%25' چاپ میشود.
این روشی ابتدایی برای مدیریت رشتههای UTF-8 و راهکاری معقول برای رسیدگی به مقادیر پایین اسکی است که در بسیاری از سیستمها باعث رفتار نامتعارف ترمینال میشوند. چنین تبدیلهایی خودتوان (idempotent) نیستند، بنابراین dwarfdump از انجام بیش از یکبار تبدیل روی هر رشته خودداری میکند. گزینه --format-suppress-sanitize در ادامه را جهت حذف تبدیل خروجی ببینید.
گزینههای چاپ (PRINTING OPTIONS)
- --print-all (-a)
- چاپ هر بخش تا جای ممکن به صورت مستقل. بخشهایی که میتوانند به صورت ایمن و مستقل چاپ شوند (مانند .debug_abbrev) اطلاعات مربوطهشان در گزارش چاپ میشود (گاهی وابسته به -v).
- --print-abbrev (-b)
- چاپ بخش .debug_abbrev. از آنجا که مشخصات DWARF نواحی دادههای نامعتبر را در .debug_abbrev غیرمجاز ندانسته است (اگر از .debug_info ارجاع داده نشده باشند)، وجود هر بایت نامعتبر میتواند منجر به شکست این عملیات چاپ شود.
- --print-loc (-c)
- چاپ فهرستهای مکان.
- --print-debug-gnu
- چاپ بخشهای .debug_gnu_pubnames و .debug_gnu_typenames.
- --print-fission
- چاپ بخشهای .gdb_index، .debug_cu_index، .debug_tu_index، .gnu.debuglink و .note.gnu.build-id.
- --print-gnu-debuglink
- چاپ بخشهای .gnu_debuglink و .note.gnu.build-id.
- --print-frame (-f)
- چاپ بخش .debug_frame.
- --print-eh-frame (-F)
- چاپ بخش GNU .eh_frame.
- --print-info (-i)
- چاپ بخش .debug_info.
- --print-fission (-I)
- چاپ هر یک از بخشهای .gdb_index، .debug_cu_index و .debug_tu_index که در شیء وجود داشته باشند.
- --print-gnu-debuglink
- اگر بخش .gnu_debuglink وجود داشته باشد محتوای آن چاپ میشود. اگر بخش .note.gnu.build-id وجود داشته باشد محتوای آن چاپ میشود. اگر فایل حاوی DWARF با نام مشخصشده در محتوای بخش .gnu_debuglink وجود داشته باشد، نام آن چاپ خواهد شد.
- --print-lines (-l)
- چاپ بخش .debug_info و دادههای بخش خطوط مرتبط با آن.
- --print-lines-short (-ls)
- چاپ بخش .debug_info و دادههای بخش خطوط مرتبط با آن، اما بدون آدرس <pc>. زمانی کاربرد دارد که مقایسه بخشهای خطوط بین اشیائی با تفاوتهای اندک مورد نیاز باشد.
- --print-macinfo (-m)
- چاپ بخشهای .debug_macinfo (در DWARF 2,3,4) و .debug_macro (در DWARF5). گزارش .debug_macro ممکن است خروجیهایی با برچسب MACRONOTES نشان دهد که به محتوای مشکوک ماکرو اشاره دارند. همچنین --check-macros (-kw) را ببینید.
- --print-ranges (-N)
- چاپ بخش .debug_ranges. از آنجا که مشخصات DWARF وجود نواحی دادههای نامعتبر در .debug_ranges را رد نکرده است (در صورتی که از .debug_info ارجاع داده نشده باشند)، هر بایت نامعتبر میتواند منجر به ناموفق بودن این چاپ شود.
- --print-pubnames (-p)
- چاپ بخش .debug_pubnames.
- --print-str-offsets
- چاپ بخش .debug_str_offsets.
- --print-aranges (-r)
- چاپ بخش .debug_aranges.
- --print-strings (-s)
- چاپ بخش .debug_string.
- --print-section-allocations
- چاپ خلاصهای کوتاه از تخصیصهای حافظه بخشها. تخصیصهای malloc و mmap بخشها را به صورت جداگانه خلاصه میکند.
- --print-static (-ta)
- چاپ بخشهای منحصر به IRIX شامل .debug_static_funcs و .debug_static_vars.
- --print-type (-y)
- چاپ بخش .debug_pubtypes (و .debug_typenames، بخشی منحصراً مربوط به SGI IRIX).
- --version (-V)
- چاپ تاریخ و رشته نسخه dwarfdump و توقف برنامه.
گزینههای بررسی (CHECKING OPTIONS)
- --check-all (-ka)
- فعالسازی تمامی گزینههای بررسی به جز --check-frame-extended (-kxe) (که ممکن است به اندازهای کند باشد که کاربر مایل به استفاده معمول از آن نباشد).
- --check-abbrev (-kb)
- بررسی برخی خطاهای بخش اختصارات هنگام خواندن DIEها.
- --check-macros (-kw)
- بررسی مشکلات موجود در .debug_macro در DWARF5 و شناسایی مواردی که ممکن است مشکوک باشند اما لزوماً خطا نیستند با رشته MACRONOTES (و گزارش برخی MACRONOTES که --print-macinfo نمایش نخواهد داد). همچنین بخش .debug_macinfo را با دقت کمتری بررسی میکند و هرگز برای .debug_macinfo پیامهای MACRONOTES صادر نمیکند. همچنین --print-macinfo (-m) را ببینید.
- --check-constants (-kc)
- بررسی خطاها در مقادیر ثابت در debug_info.
- -check-show (-kd)
- فعالسازی گزارش کامل مجموع خطاها به تفکیک سازنده/کامپایلر (producer) (پیشفرض جزئیات کمتری نشان میدهد).
- --check-silent-ks
- غیرفعال کردن برخی شناساییهای بررسی پرجزئیات.
- --check-attr-dup (-kD)
- فعالسازی گزارش ویژگیهای تکراری. وجود ویژگیهای تکراری روی یک DW_TAG مشخص در استاندارد DWARF نادرست است، اما حداقل یک کامپایلر چنین خروجیای تولید کرده است.
- --check-pubnames (-ke)
- فعالسازی خواندن pubnames و بررسی خطاهای fde.
- --check-frame-info (-kf)
- فعالسازی بررسی خطاهای FDE (در .debug_frame و .eh_frame).
- --check-files-lines (-kF)
- فعالسازی بررسی خطاهای جدول خطوط.
- --check-gaps (-kg)
- فعالسازی بررسی فضاهای خالی استفادهنشده در .debug_info (این فضاها خطا نیستند، بلکه فقط اتلاف فضا هستند).
- --check-unique (-kG)
- تنها چاپ خطاهای یکتا. خطوط خطا سادهسازی میشوند (برای مثال اعداد هگزادسیمال حذف میشوند) و اگر رشته پیامی دوباره تکرار شود، از نمایش آن جلوگیری به عمل میآید.
- --check-summary (-ki)
- چاپ خلاصهای از نتایج بررسی به ازای هر کامپایلر (سازنده) در پایان کار.
- --check-loc (-kl)
- فعالسازی بررسی فهرستهای مکان.
- --check-ranges (-km)
- فعالسازی بررسی محدودهها.
- --check-aranges (-kM)
- فعالسازی بررسی aranges.
- --check-tag-attr (-kr)
- فعالسازی بررسی ترکیبهای برچسب-ویژگی (tag-attr) در DIEها، با هدف یافتن ویژگیهای غیرمنتظره برای برچسبهای DIE. برای هر مورد یافتشده یک پیام DWARF-CHECK چاپ میکند. افزونههای متداول را به عنوان خطا گزارش نمیکند. خلاصهای از کاربرد در پایان چاپ میشود. افزونههای رایج استاندارد طوری مجاز شمرده میشوند که گویی استاندارد هستند. برای مشاهده افزونههای متداول به صورت پیامهای DWARF-CHECK گزینه -C (--format-extensions) را ببینید. برای افزودن جزئیات تکمیلی به گزارش خلاصه گزینه -kuf (--check-usage-extended) را ببینید.
- --check-usage (-ku)
- مشابه با -kr، با این تفاوت که تنها خلاصه در انتها چاپ میشود و پیامهای تفصیلی DWARF-CHECK برای هر نمونه چاپ نمیگردند.
- --check-attr-encodings (-kE)
- بررسی نحوه کدگذاری اعداد صحیح در فرمهای ثابت در debug_info، محاسبه اینکه آیا این مقادیر صحیح میتوانند در صورت نمایش با LEB128 در بایتهای کمتری جا شوند یا خیر، و گزارش صرفهجویی فضایی حاصل از آن.
- --check-forward-refs (-kR)
- فعالسازی خواندن DIEها و بررسی اعلانهای رو به جلو حاصل از ویژگیهای DW_AT_specification (که خطا محسوب نمیشوند اما میتوانند منشأ ناکارآمدی برای دیباگرها باشند).
- --check-self-refs (-kS)
- فعالسازی بررسی ارجاعات DIE برای یافتن ارجاعات چرخهای.
- --check-tag-tag (-kt)
- فعالسازی بررسی ترکیبهای برچسب-برچسب، جهت یافتن رابطههای والد-فرزند غیرمنتظره میان DIEها. افزونههای متداول را به عنوان خطا گزارش نمیکند. افزونههای رایج به عنوان استاندارد تلقی میشوند. برای مشاهده افزونههای رایج به عنوان خطا، گزینه -C (--format-extensions) را ببینید.
- --check-frame-basic (-kx)
- فعالسازی بررسی پایهای فریمها برای .debug_frame و .eh_frame.
- --check-frame-extended (-kxe)
- غیرفعال کردن بررسی پایهای فریمها و فعالسازی بررسی گسترده فریمها برای .debug_frame و .eh_frame. این گزینه میتواند کند باشد.
- --check-type (-ky)
- فعالسازی بررسی type_offset (اطمینان از اینکه آفستهای صفتهای محلی به موارد مورد نظر اشاره دارند) و بررسی اینکه DW_AT_decl_file و برخی آفستهای دیگر به مکانهای مناسب ارجاع میدهند.
گزینههای متفرقه (MISCELLANEOUS OPTIONS)
- --allocate-via-mmap
- در صورت امکان، libdwarf بهجای malloc از mmap برای بارگذاری محتوای بخشها در حافظه استفاده خواهد کرد.
- --suppress-de-alloc-tree
- به libdwarf دستور میدهد تا از رهگیری و آزادسازی کلیه تخصیصهای حافظه صرفنظر کرده و آزادسازی را به کد شما واگذار کند. از valgrind یا یک گزینه کامپایلر مانند -fsanitize برای بررسی برنامه خود از نظر عدم موفقیت در آزادسازی مناسب استفاده کنید. این کار کارایی libdwarf را چند درصد بهبود میبخشد.
- --suppress-debuglink-crc
- به libdwarf دستور میدهد تا از محاسبه مقادیر crc مربوط به debuglink خودداری کند، که باعث صرفهجویی اندکی در زمان راهاندازی و حذف یک بررسی مفید میشود. با این حال، یافتن فایلهای جایگزین debuglink یا buildid همچنان فعال باقی میماند.
- --no-follow-debuglink
- به dwarfdump و libdwarf دستور میدهد تا هیچ توجهی به ارجاعات .gnu.debuglink یا .gnu.note.buildid یا dSYM در macOS نکنند.
تغییردهندههای گزینهها (OPTION MODIFIERS)
- --format-extensions (-C)
- این یک گزینه ثانویه پس از --check-tag-tag (-kt) یا --check-tag-attr (-kr) است. در حالت عادی هنگام بررسی ترکیبهای برچسب-برچسب یا برچسب-ویژگی، هم ترکیبهای استاندارد و هم برخی افزونههای متداول مجاز دانسته میشوند (گزارش نمیشوند). با فعالسازی این گزینه، افزونهها از دسته ترکیبهای مجاز خارج شده و گزارش میشوند.
- -kuf (--check-usage-extended)
- این گزینه عملکرد --check-tag-attr (-kr) یا --check-usage (-ku) را تغییر میدهد تا جزئیات بیشتری را در خلاصه چاپ کند. گزینه -kuf (--check-usage-extended) را قبل یا بعد از گزینهای که تغییر میدهد اضافه کنید.
- --format-dense (-d)
- هنگام چاپ DIEها، تمام ویژگیهای مربوط به هر DIE را در همان خط (طولانی) به همراه TAG قرار میدهد. این کار جستجوی اطلاعات DIE را (مثلاً با grep) بسیار سادهتر میکند زیرا کل اطلاعات DIE در یک خط قرار میگیرد.
- --format-suppress-offsets (-D)
- نمایش آفستهای بخش و مقادیر ویژگیها را در خروجی چاپی غیرفعال میکند. بدین ترتیب خروجی .debug_info تنها شامل TAGها و ویژگیها خواهد بود. برای pubnames (و موارد مشابه) آفستها را از خروجی حذف میکند. برای فهرستهای مکان آفستها را از خروجی حذف میکند، اما این حالت عملاً بلااستفاده است زیرا مقادیر ویژگیها نشان داده نمیشوند و در نتیجه دادههای مکانی نیز نمایش نمییابند.
- --format-ellipsis (-e)
- کوتاهسازی نام ویژگیها و برچسبها را فعال میکند. به عنوان مثال DW_TAG_foo به foo تبدیل میشود. این گزینه با بررسی خطاها سازگار نیست و فقط برای چاپ DIEها مفید است.
- --format-global-offsets (-G)
- هنگام چاپ، آفستهای سراسری را به آفستهای چاپشده اضافه میکند.
- --format-limit=<num> (-H number)
- هنگام چاپ یا بررسی .debug_info، جستجو را پس از تعداد 'number' واحد کامپایل متوقف میکند. هنگام چاپ اطلاعات فریم، گزارشگیری FDE را پس از 'number' FDE و گزارشگیری CIE را (که در صورت افزودن -v رخ میدهد) پس از 'number' CIE خاتمه میدهد. مثال: '--format-limit=1'.
- --format-attr-name (-M)
- هنگام چاپ، فرم (FORM) هر ویژگی را نشان میدهد. اگر یک -v (یا چند مورد) اضافه شود، جزئیات هرگونه ارجاع غیرمستقیم فرم نیز نشان داده میشود.
- --format-suppress-lookup (-n)
- هنگام چاپ فریمها، جستجوی نام توابع در دامنههای درونی را خاموش میکند. مگر اینکه زبان مورد استفاده برای ساخت فایل شیء از تعاریف توابع در دامنههای درونی پشتیبانی کند، هیچ فایدهای در جستجوی نام توابع در دامنههای درونی وجود ندارد. و در یک شیء بسیار حجیم این جستجو میتواند بیش از حد انتظار زمان ببرد. این گزینه جستجو در دامنههای درونی را غیرفعال میکند.
- --file-output=<path> (-Ofile=<path>)
- مسیر <path> به عنوان نام فایل برای ذخیره خروجی بهجای نوشتن در خروجی استاندارد استفاده خواهد شد (خروجی استاندارد حالت پیشفرض است).
- --format-suppress-data (-Q)
- چاپ دادههای بخشها را متوقف میکند (با انتخاب هر یک از گزینههای بررسی به صورت خودکار فعال میشود).
- --format-suppress-sanitize
- تبدیلهای پیشفرض چاپ رشتهها را غیرفعال میکند تا نویسههای غیر اسکی و غیرقابلچاپ از فایل شیء به همان شکل اصلی چاپ شوند. بخش "خروجی با سبک URI" در بالا را ببینید.
- --format-suppress-uri (-U)
- تبدیل پیشفرض URI برای گزینههای بعدی در خط فرمان را غیرفعال میکند. بخش "رشتههای ورودی با سبک URI" در بالا را ببینید.
- --format-registers (-R)
- هنگام چاپ فریمها برای ABIهایی با تعداد زیادی رجیستر، امکان نامگذاری تا ۱۲۰۰ رجیستر (مانند R999) را بدون انتخاب یک ABI با گزینههایی نظیر '-x abi=ppc' یا معادل آن '--file-abi=ppc' فراهم میکند.
- --verbose (-v)
- میزان جزئیات نمایشدادهشده هنگام چاپ را افزایش میدهد. در برخی بخشها، استفاده از گزینههای بیشتر -v جزئیات را افزایش میدهد (یک تا چهار مورد مفید است) یا ممکن است گزارش را طوری تغییر دهد که مثلاً دستورات واقعی دادههای خطوط را بهجای جدول حاصل از خطوط نشان دهد. دو تا چهار گزینه -v هنگام چاپ DIEها و rnglists (با -i)، خطوط (-l)، فریمها (-f, -F) و gdb_index (با -I) تغییر ایجاد میکنند. افزودن -v بیش از چهار بار در حال حاضر چیزی به خروجی اضافه نکرده و تغییری ایجاد نمیکند.
- --show-dwarfdump-conf
- فایلهایی را که برای یافتن dwarfdump.conf و جداول نامگذاری رجیستر آن بررسی میشوند نشان میدهد.
محدودسازی خروجی (LIMITING OUTPUT)
سادهترین گزینه محدودسازی، متوقف کردن بررسی/چاپ پس از <num> واحد کامپایل است. گزینههای -H و --format-limit در بالا را ببینید. این گزینه همچنین تعداد FDEها و CIEهای چاپشده از هر بخش .debug_frame یا .eh_frame را محدود میکند.
گزینههای جستجو --search (-S) اطلاعات مربوط به واحد کامپایل و DIEهایی را که رشته(ها) در آنها ظاهر شدهاند چاپ میکنند. این گزینهها را نمیتوان با سایر گزینهها ترکیب کرد. حداکثر یکی از هر یک از موارد زیر مؤثر واقع میشود (بنابراین برای مثال تنها میتوان یک 'match' داشت، اما میتوان همزمان یک 'match'، یک 'any' و یک 'regex' داشت). هر گزینه --search (-S) باعث بررسی بخش .debug_info میشود. هیچ گزینه بررسی یا چاپ نباید همراه با گزینههای --search (-S) مشخص شود. رشتهها باید به سبک URI باشند تا از هرگونه تداخل با تجزیهکننده خط فرمان مورد نظر (bash, sh, ...) یا ()getopt جلوگیری شود، و همچنین سبک URI برای جستجوی رشتههای غیر اسکی مانند زبانهای دیگر یا کدگذاری فراگیر UTF8 به کار میرود. پیادهسازی عبارات منظم (regex) تنها نویسههای اسکی را در عبارت میپذیرد و تنها عبارات منظم پایه را پردازش میکند، که مشابه POSIX Basic Regular Expressions (PBRE) هستند، اما سازه گروهبندی () در PBRE در اینجا غیرضروری به نظر میرسد، بنابراین پیشنهاد میکنیم از گروهبندی () استفاده نکنید.
این گزینهها به ویژه زمانی که حجم اطلاعات DWARF خروجی توسط -i چندین گیگابایت داده باشد بسیار سودمند هستند.
اگر بهجای -S از -Sv استفاده شود، تعداد رخدادها چاپ میشود (مثال زیر را ببینید).
- --search-match=<string> (-Smatch=string)
- --search-match-count=<string> (-Svmatch=string)
- هنگام چاپ DIEها، به ازای هر مقدار برچسب یا نام صفت که دقیقاً با 'string' مطابقت داشته باشد، اطلاعات واحد کامپایل و آفست بخش آن را چاپ میکند. هر CU که تطابقی نداشته باشد چاپ نمیشود. آرگومان 'string' به عنوان یک رشته URI خوانده میشود. حالت شمارش (Sv) تعداد دفعات وقوع را گزارش میدهد.
- --search-any=<string> (-Sany=string)
- --search-any-count=<string> (-Svany=string)
- هنگام چاپ DIEها، به ازای هر مقدار برچسب یا نام صفت که حاوی 'string' در هر کجای برچسب یا صفت باشد (بدون حساسیت به حروف کوچک و بزرگ)، اطلاعات واحد کامپایل و آفست بخش آن را چاپ میکند. هر CU بدون تطابق چاپ نمیشود. رشته 'string' به صورت رشته URI خوانده میشود. فرم شمارش (Sv) تعداد رخدادها را گزارش میکند.
- --search-regex=string (-Sregex=string)
- --search-regex-count=string (-Svregex=string)
- هنگام چاپ DIEها، به ازای هر مقدار برچسب یا نام صفت که با عبارت منظم 'string' تطابق داشته باشد، اطلاعات واحد کامپایل و آفست بخش آن را چاپ میکند. هر CU بدون تطابق چاپ نمیشود. رشته 'string' به عنوان رشته URI خوانده میشود. فرم شمارش (Sv) تعداد دفعات وقوع را گزارش میدهد.
رشته ورودی نمیتواند حاوی فاصلهها یا نویسههای دیگری باشد که برای getopt(3) معنادار هستند و پوسته نیز کوتیشنها و سایر نویسهها را حذف خواهد کرد. بنابراین فرض میشود رشته در قالب سبک URI است و ترجمه میشود. به عبارت دیگر، برای تطابق با 'a b' رشته -S را به صورت 'a%20b' درج کنید. بهجای اسکیپ کردن نقلقولهای " در رشته، مقدار %25 را بنویسید، مثلاً 'a "b' باید به صورت 'a%20%25b' نوشته شود (علامتهای ' در اینجا برای توضیح هستند و جزئی از رشته نیستند). هر نویسهای را میتوان به سبک URI نوشت، نه فقط نویسههای مشکلساز برای شل یا getopt.
گزینههای --search-any (-Sany) و --regex-any (-Sregex) تنها در صورتی قابل استفاده هستند که توابع کتابخانه عبارت منظم مورد نیاز در زمان پیکربندی و کامپایل یافت شده باشند.
گزینه --search-print (-W) یک تغییردهنده برای گزینه -S است و میزان خروجی چاپی توسط -S را افزایش میدهد. یک نمونه از اصلاحکننده v به گزینه -S در زیر نشان داده شده است، و کاربرد -W را در کنار گزینه -S نمایش میدهیم:
- --search-match-count=string
- اطلاعات مربوط به DIEهایی را که با -S مطابقت دارند به همراه تعداد دفعات وقوع چاپ میکند.
- -S match=string1 -W
- --search-match=string1 --search-print-tree
- درخت والد و درخت فرزندان را برای DIEهایی که با --search-match مطابقت دارند چاپ میکند.
- -S match=string2 -Wp
- --search-match=string2 --search-print-parent
- درخت والد را برای DIEهایی که با -S تطابق دارند چاپ میکند.
- -S match=string3 -Wc
- --search-match=string3 --search-print-children
- درخت فرزندان را برای DIEهایی که با -S تطابق دارند چاپ میکند.
- --format-gcc (-cg)
- چاپ و بررسی را به کامپایلرهایی محدود میکند که رشته سازنده آنها با 'GNU' آغاز میشود و گزینه -cs را خاموش میکند.
- --format-snc (-cs)
- چاپ و بررسی را به کامپایلرهایی محدود میکند که رشته سازنده آنها با 'SN' آغاز میشود و گزینه -cg را خاموش میکند.
- --format-producer=<name> (-c<name>)
- چاپ و بررسی را به کامپایلرهایی محدود میکند که رشته سازنده آنها شامل 'name' است (بدون حساسیت به حروف بزرگ و کوچک). شناسه 'name' به صورت یک رشته URI خوانده میشود.
سایر گزینهها (OTHER OPTIONS)
- -x name=<path>
- --file-name=/p/a/t/h.conf (-xname=/p/a/t/h.conf)
- مسیر فایل دادهشده، نام فایلی در نظر گرفته میشود که ساختاری مشابه با dwarfdump.conf دارد. مسیر فایل به صورت یک رشته URI خوانده میشود.
- -x abi=ppc
- --file-abi=ppc
- انتخاب abi (از فایل dwarfdump.conf) جهت استفاده در چاپ اطلاعات فریم (در اینجا از ppc به عنوان مثال استفاده شده است). آرگومان abi به عنوان یک رشته URI خوانده میشود.
- --format-group-number=<n> (-x groupnumber=<n>)
- برای فایل شیئی که هم دارای بخشهای تفکیکشده DWARF5 split dwarf (برای مثال .debug_info.dwo) و هم بخشهای معمولی DWARF (برای مثال .debug_info) در همان فایل شیء منفرد است، باید از گزینه --format-group-number=2 جهت چاپ بخشهای dwo استفاده شود. افزودن --file-tied=<path> با تعیین نام فایل شیء، بخشهای اسکلتی غیر dwo را پیوند میدهد (هنگامی که فایل شیء اصلی dwo/dwp باشد، مسیر <path> به فایل شیء اسکلتی اشاره دارد).
- -x tied=/t/i/depath
- --file-tied=/t/i/depath
- هنگام باز کردن یک شیء اصلی که فایل .dwo یا .dwp است استفاده میشود. برای مثال اگر /path/to/myapp.dwp شیء split-dwarf باشد و /path/to/myapp فایل اجرایی باشد، دستور "dwarfdump --file-tied=/path/to/myapp /path/to/myapp.dwp" را اجرا کنید. مسیر فایل پیوندخورده نام فایل اجرایی را مشخص میکند که دارای بخش .debug_addr است که ممکن است از شیء اصلی به آن ارجاع داده شده باشد. بخش Split Objects (یا همان Debug Fission) در استاندارد DWARF5 را ببینید. این گزینه را نمیتوان همراه با اشکالزدایی macOS یا GNU debuglink به کار برد، زیرا این فایلها فاقد فایل شیء Split Dwarf هستند.
- -x line5=s2l
- --file-line5=s2l
- معمولاً تنها برای آزمایش رابطهای libdwarf استفاده میشود. ۴ مجموعه توابع رابط مختلف وجود دارد و برای اطمینان از عملکرد همگی آنها، این گزینه اجازه میدهد مشخص کنیم از کدامیک استفاده شود. گزینهها عبارتند از: 's2l' (پیشفرض، امکان استفاده از جداول خطوط استاندارد و دو سطحی را با بهکارگیری جدیدترین توابع رابط فراهم میکند)، 'std' (امکان جداول خطوط تکسطحی استاندارد با استفاده از جدیدترین توابع رابط)، 'orig' (امکان استفاده از جداول خطوط اولیه DWARF2,3,4 با استفاده از توابع رابط قدیمیتر)، 'orig2l' (امکان استفاده از جداول خطوط اولیه و برخی جداول خطوط دو سطحی با استفاده از مجموعه رابط قدیمیتر).
- --print-producers
- -P هنگام بررسی خطاها، این گزینه فهرست نامهای واحدهای کامپایل مشاهدهشده برای هر سازنده-کامپایلر را به نتایج چاپی بررسی اضافه میکند.
- -q
- --format-suppress-uri-msg
- هنگام خواندن خط فرمان، در صورت یافتن و تبدیل یک URI، پیام تبدیل URI را بیصدا نگه میدارد؛ به این معنی که رشته گزینههای اولیه و تبدیلشده را چاپ نمیکند.
- -u cuname
- --format-file=<file>
- فعالسازی چاپ انتخابی DIEها (چاپ مشابه با -i). تنها DIEهای مربوط به واحد کامپایلی که با نام ارائهشده مطابقت داشته باشند چاپ میشوند. اگر واحد کامپایل ./a/b/c.c باشد، مقدار 'cuname' ارائهشده باید c.c باشد زیرا نویسههای منتهی به آخرین / جداکننده مسیر نادیده گرفته میشوند. اگر 'cuname' با یک / آغاز شود، کل رشته نام یک واحد کامپایل باید با 'cuname' تطابق داشته باشد. شناسه 'file' به عنوان یک رشته URI خوانده میشود.
- -U
- --format-suppress-uri
- تفسیر URI رشتههای خط فرمان را به طور کامل غیرفعال میکند. برای اثربخشی کامل باید در خط فرمان پیش از مواجهه با هرگونه رشته URI قرار گیرد. این گزینه احتمالاً چیزی است که هیچکس نیازی به انجام آن ندارد.
- -h
- --help
- نمایش این صفحه راهنما.
DWARF تفکیکشده (SPLIT DWARF)
در حالت DWARF تفکیکشده (DWARF5)، بدنه اصلی اطلاعات DWARF در یک فایل جداگانه قرار دارد که اغلب دارای پسوند نام dwp. یا dwo. است.
برای مثال اگر /path/to/myapp.dwp شیء split-dwarf باشد و /path/to/myapp فایل اجرایی باشد، دستور "dwarfdump --file-tied=/path/to/myapp /path/to/myapp.dwp" را اجرا کنید. مسیر فایل پیوندخورده نام فایل اجرایی را مشخص میکند که دارای بخش .debug_addr و سایر بخشهایی است که ممکن است از شیء dwo/.dwp. به آنها ارجاع داده شده باشد.
به بخش Split Object Files (که گاهی Debug Fission نامیده میشود) در استاندارد DWARF5، بخش 7.3 مراجعه کنید.
فایلها (FILES)
dwarfdump
./dwarfdump.conf
$(HOME)/.dwarfdump.conf
$(HOME)/dwarfdump.conf
<install-prefix>/lib/dwarfdump.conf
نکات (NOTES)
از نسخه 2.2.0 به بعد، dwarfdump فرمهای بلوکی مانند DW_FORM_block2 (و غیره) را برای یافتن محتوایی که شبیه به یک رشته معتبر UTF8 به نظر میرسد بررسی میکند. هر موردی از این دست با پیشوند 0x در قالب هگزادسیمال چاپ شده و با یک دو نقطه (:) پایان مییابد. در ادامه، رشته مورد نظر (اگر طول آن بیش از ۱ بایت و کمتر از ۵۰۰۰ بایت باشد) با عبارت پیشوند "Block As Quoted String " چاپ میشود که هدف از آن سادهسازی جستجوی چنین مواردی در خروجی dwarfdump است.
در برخی موارد کامپایلرها برای مثال از DW_FORM_data1 استفاده میکنند و در چنین شرایطی علامتدار بودن یا نبودن مقدار باید از زمینه برداشت شود. بهجای تلاش برای تشخیص زمینه، dwarfdump هرگاه ابهامی در تفسیر صحیح وجود داشته باشد مقدار را با هر دو حالت علامتدار و بدون علامت چاپ میکند. برای مثال: "DW_AT_const_value 176(as signed = -80)". برای مصرفکنندگان عادی DWARF که تمام ویژگیها را به درستی و به طور کامل ارزیابی میکنند هیچ ابهامی در علامتدار بودن وجود ندارد؛ ابهام در dwarfdump ناشی از آن است که dwarfdump ورودیهای DIE را به ترتیبی ساده ارزیابی میکند و زمینه چندانی را حفظ نمینماید.
اشکالات (BUGS)
پشتیبانی از چاپ برخی عبارتهای مکانی DWARF5 ناقص است. مشکلات را به آدرس libdwarf-list -at- linuxmail -dot- org گزارش دهید.