.\" Man page generated from reStructuredText .\" by the Docutils 0.23 manpage writer. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "LLVM-DEBUGINFO-ANALYZER" "1" "2026-07-15" "22" "LLVM" .SH "نام (NAME)" llvm-debuginfo-analyzer \- چاپ نمایشی منطقی از اطلاعات اشکال‌زدایی سطح پایین. .INDENT 0.0 .IP \(bu 2 خلاصه دستور (SYNOPSIS) .IP \(bu 2 توضیحات (DESCRIPTION) .IP \(bu 2 گزینه‌ها (OPTIONS) .INDENT 2.0 .IP \(bu 2 عمومی (GENERAL) .IP \(bu 2 مشخصه‌ها (ATTRIBUTES) .IP \(bu 2 چاپ (PRINT) .IP \(bu 2 خروجی (OUTPUT) .IP \(bu 2 گزارش (REPORT) .IP \(bu 2 گزینش (SELECTION) .INDENT 2.0 .IP \(bu 2 عناصر (ELEMENTS) .IP \(bu 2 خطوط (LINES) .IP \(bu 2 حوزه‌ها (SCOPES) .IP \(bu 2 نمادها (SYMBOLS) .IP \(bu 2 نوع‌ها (TYPES) .UNINDENT .IP \(bu 2 مقایسه (COMPARE) .IP \(bu 2 هشدار (WARNING) .IP \(bu 2 داخلی (INTERNAL) .UNINDENT .IP \(bu 2 مثال‌ها (EXAMPLES) .INDENT 2.0 .IP \(bu 2 مورد آزمون ۱ \- گزینه‌های عمومی .INDENT 2.0 .IP \(bu 2 حالت چاپ .INDENT 2.0 .IP \(bu 2 جزئیات پایه .IP \(bu 2 انتخاب عناصر منطقی .UNINDENT .IP \(bu 2 حالت مقایسه .INDENT 2.0 .IP \(bu 2 نمای منطقی .IP \(bu 2 عناصر منطقی .UNINDENT .UNINDENT .IP \(bu 2 مورد آزمون ۲ \- دستورالعمل‌های اسمبلی .INDENT 2.0 .IP \(bu 2 CodeView \- Clang (Windows) .IP \(bu 2 CodeView \- MSVC (Windows) .IP \(bu 2 DWARF \- Clang (Linux) .IP \(bu 2 DWARF \- GCC (Linux) .UNINDENT .IP \(bu 2 مورد آزمون ۳ \- حوزه واژگانی نادرست برای TYPEDEF .INDENT 2.0 .IP \(bu 2 CodeView \- Clang (Windows) .IP \(bu 2 CodeView \- MSVC (Windows) .IP \(bu 2 DWARF \- Clang (Linux) .IP \(bu 2 DWARF \- GCC (Linux) .UNINDENT .IP \(bu 2 مورد آزمون ۴ \- شمارش‌های تودرتوی مفقود .INDENT 2.0 .IP \(bu 2 CodeView \- Clang (Windows) .IP \(bu 2 CodeView \- MSVC (Windows) .IP \(bu 2 DWARF \- Clang (Linux) .IP \(bu 2 DWARF \- GCC (Linux) .UNINDENT .IP \(bu 2 مورد آزمون ۵ \- حوزه واژگانی نادرست برای متغیر .INDENT 2.0 .IP \(bu 2 CODEVIEW \- Clang (Windows) .IP \(bu 2 CODEVIEW \- MSVC (Windows) .IP \(bu 2 DWARF \- Clang (Linux) .IP \(bu 2 DWARF \- GCC (Linux) .UNINDENT .IP \(bu 2 مورد آزمون ۶ \- نمای منطقی کامل .IP \(bu 2 پشتیبانی از WEBASSEMBLY .INDENT 2.0 .IP \(bu 2 چاپ جزئیات پایه .IP \(bu 2 گزینش عناصر منطقی .IP \(bu 2 حالت مقایسه .INDENT 2.0 .IP \(bu 2 نمای منطقی .IP \(bu 2 عناصر منطقی .UNINDENT .UNINDENT .UNINDENT .IP \(bu 2 وضعیت خروج (EXIT STATUS) .IP \(bu 2 محدودیت‌ها و مشکلات شناخته‌شده .IP \(bu 2 همچنین ببینید (SEE ALSO) .UNINDENT.SH "خلاصه دستور (SYNOPSIS)" .sp \fBllvm\-debuginfo\-analyzer\fP [\fIoptions\fP] [\fIfilename ...\fP] .SH "توضیحات (DESCRIPTION)" .sp \fBllvm\-debuginfo\-analyzer\fP بخش‌های debug و text را در فایل‌های شیء دودویی (binary object files) تجزیه کرده و محتوای آن‌ها را در یک نمای منطقی (logical view) چاپ می‌کند؛ این نما بازنمایی خوانایی برای انسان است که تطابق نزدیکی با ساختار کد منبع اصلی کاربر دارد. قالب‌های فایل شیء پشتیبانی‌شده شامل ELF، Mach\-O، WebAssembly، PDB و COFF هستند. .sp \fBنمای منطقی\fP پیچیدگی‌های مربوط به نمایش‌های گوناگون سطح پایین اطلاعات اشکال‌زداییِ تعبیه‌شده در فایل شیء را انتزاع می‌کند. \fBllvm\-debuginfo\-analyzer\fP صرف‌نظر از چگونگی قالب‌بندی اطلاعات اشکال‌زدایی، یک نمای استاندارد و متعارف (canonical) از آن تولید می‌کند. با فرض این‌که اطلاعات اشکال‌زدایی به‌درستی بیانگر همان کد منبع اصلی باشند، بدون در نظر گرفتن قالب فایل شیء، همان نمای منطقی یکسان مشاهده خواهد شد. .sp نمای منطقی شامل \fBعناصر منطقی\fP زیر است: \fItype\fP، \fIscope\fP، \fIsymbol\fP و \fIline\fP که عناصر پایه‌ای نرم‌افزار مورد استفاده در زبان برنامه‌نویسی C/C++ هستند. هر عنصر منطقی دارای مجموعه‌ای از \fBویژگی‌ها\fP (attributes) است، مانند \fItypes\fP، \fIclasses\fP، \fIfunctions\fP، \fIvariables\fP، \fIparameters\fP و غیره. گزینهٔ \fB\-\-attribute\fP می‌تواند برای مشخص کردن ویژگی‌هایی به کار رود که هنگام چاپ یک عنصر منطقی باید لحاظ شوند. یک عنصر منطقی ممکن است دارای یک \fBkind\fP باشد که انواع خاصی از عناصر را توصیف می‌کند؛ به عنوان مثال، یک \fIscope\fP می‌تواند دارای نوعِ (kind) \fIfunction\fP، \fIclass\fP یا \fInamespace\fP باشد\&. .sp \fBllvm\-debuginfo\-analyzer\fP به‌طور پیش‌فرض چیدمان از پیش‌تعریف‌شده‌ای از عناصر و ویژگی‌های منطقی را چاپ می‌کند. از گزینه‌های خط فرمان می‌توان برای کنترل عناصر چاپ‌شده (\fB\-\-print\fP)، استفاده از یک چیدمان مشخص (\fB\-\-report\fP) و مطابقت با یک الگوی معین (\fB\-\-select\fP، \fB\-\-select\-offsets\fP) استفاده کرد. همچنین خروجی را می‌توان با استفاده از (\fB\-\-select\-lines\fP، \fB\-\-select\-scopes\fP، \fB\-\-select\-symbols\fP، \fB\-\-select\-types\fP) به عناصر منطقی مشخص‌شده محدود نمود. .sp \fBllvm\-debuginfo\-analyzer\fP همچنین می‌تواند مجموعه‌ای از نماهای منطقی را با یکدیگر مقایسه کند (\fB\-\-compare\fP) تا تفاوت‌ها را بیابد و خطاهای نحوی احتمالی در اطلاعات اشکال‌زدایی (\fB\-\-warning\fP) را در هر فایل شیء شناسایی کند. .SH "گزینه‌ها (OPTIONS)" .sp گزینه‌های \fBllvm\-debuginfo\-analyzer\fP به چند دسته تقسیم می‌شوند که هر یک برای هدف خاصی طراحی شده‌اند: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 GENERAL \- گزینه‌های استاندارد LLVM برای نمایش راهنما، نگارش و غیره. .IP \(bu 2 ATTRIBUTES \- توصیف چگونگی گنجاندن جزئیات مختلف هنگام چاپ یک عنصر. .IP \(bu 2 PRINT \- مشخص کردن این‌که کدام عناصر هنگام چاپ نما لحاظ شوند. .IP \(bu 2 OUTPUT \- توصیف قالب‌های پشتیبانی‌شده هنگام چاپ نما. .IP \(bu 2 REPORT \- توصیف چیدمان‌های قالب برای چاپ نما. .IP \(bu 2 SELECTION \- امکان استفاده از معیارها یا شرایط خاص برای انتخاب عناصر جهت چاپ. .IP \(bu 2 COMPARE \- مقایسهٔ نماهای منطقی و چاپ عناصر ناموجود یا اضافه‌شده. .IP \(bu 2 WARNING \- چاپ هشدارهای شناسایی‌شده در حین ایجاد نما. .IP \(bu 2 INTERNAL \- تحلیل داخلی نمای منطقی. .UNINDENT .UNINDENT .UNINDENT .SS GENERAL .sp این بخش گزینه‌های استاندارد راهنما را شرح می‌دهد که برای نمایش نحوهٔ استفاده، نگارش، فایل‌های پاسخ (response files) و غیره به کار می‌روند. .INDENT 0.0 .TP .B \-h, \-\-help نمایش راهنما و نحوهٔ استفاده از این دستور. (\-\-help\-hidden برای موارد بیشتر). .UNINDENT .INDENT 0.0 .TP .B \-\-help\-list نمایش راهنما و نحوهٔ استفاده از این دستور بدون گروه‌بندی گزینه‌ها در دسته‌ها (\-\-help\-list\-hidden برای موارد بیشتر). .UNINDENT .INDENT 0.0 .TP .B \-\-help\-hidden نمایش تمام گزینه‌های موجود. .UNINDENT .INDENT 0.0 .TP .B \-\-print\-all\-options چاپ مقادیر تمام گزینه‌ها پس از تجزیهٔ خط فرمان. .UNINDENT .INDENT 0.0 .TP .B \-\-print\-options چاپ گزینه‌های غیرپیش‌فرض پس از تجزیهٔ خط فرمان. .UNINDENT .INDENT 0.0 .TP .B \-\-version نمایش نگارش ابزار. .UNINDENT .INDENT 0.0 .TP .B @ خواندن گزینه‌های خط فرمان از \fI\fP\&. .UNINDENT .sp اگر هیچ فایل ورودی مشخص نشود، \fBllvm\-debuginfo\-analyzer\fP به‌طور پیش‌فرض \fIa.out\fP را می‌خواند و در صورتی که فایل ورودی پیدا نشود، خطایی بازمی‌گرداند. .sp اگر از \fI\-\fP به عنوان فایل ورودی استفاده شود، \fBllvm\-debuginfo\-analyzer\fP ورودی را از جریان ورودی استاندارد خود می‌خواند..SS "مشخصه‌ها (ATTRIBUTES)" .sp گزینه‌های زیر مشخصه‌های ارائه‌شده برای عناصر چاپ‌شده را فعال می‌کنند. این مشخصه‌ها بر اساس نوع داده‌ای که افزوده می‌شود به دسته‌هایی تقسیم می‌شوند، مانند: آفست‌های داخلی در فایل باینری، توصیف‌کننده‌های مکان، نام‌های ثبات، نام فایل‌های منبع کاربر، تبدیلات اضافی عنصر، نام زنجیره ابزار، قالب فایل باینری، و غیره. .INDENT 0.0 .TP .B \-\-attribute= که در آن \fBvalue\fP یکی از گزینه‌های موجود در فهرست‌های زیر است. .INDENT 7.0 .INDENT 3.5 .sp .EX =all: شامل تمام مشخصه‌های زیر. =extended: افزودن مشخصه‌های سطح پایین (low\-level). =standard: افزودن مشخصه‌های استاندارد سطح بالا (high\-level). .EE .UNINDENT .UNINDENT .sp مشخصه‌های زیر رایج‌ترین اطلاعات را برای یک عنصر منطقی توصیف می‌کنند. آن‌ها به شناسایی سطح حوزه لغوی (lexical scope level)، میزان دید عنصر در میان ماژول‌ها (سراسری، محلی)، نام زنجیره ابزار و زبان منبعی که فایل باینری را تولید کرده است کمک می‌کنند. .INDENT 7.0 .INDENT 3.5 .sp .EX =global: عنصری که در چندین Compile Unit به آن ارجاع شده است. =format: نام قالب فایل شیء (object file). =language: نام زبان منبع (source language). =level: سطح حوزه لغوی (File=0, Compile Unit=1). =local: عنصری که فقط در همان Compile Unit به آن ارجاع شده است. =producer: نام شناسایی زنجیره ابزار (toolchain). .EE .UNINDENT .UNINDENT .sp مشخصه‌های زیر نام فایل‌ها و دایرکتوری‌ها را از کد منبع کاربر توصیف می‌کنند، جایی که عناصر در آن اعلان یا تعریف شده‌اند؛ همچنین توابعی با دید عمومی در میان ماژول‌ها. این گزینه‌ها امکان نگاشت عناصر به مکانشان در کد کاربر را برای اهداف ارجاع متقابل (cross reference) فراهم می‌کنند. .INDENT 7.0 .INDENT 3.5 .sp .EX =directories: دایرکتوری‌های ارجاع‌داده‌شده در اطلاعات اشکال‌زدایی. =filename: نام فایلی که عنصر در آن تعریف شده است. =files: فایل‌های ارجاع‌داده‌شده در اطلاعات اشکال‌زدایی. =pathname: نام مسیری که شیء در آن تعریف شده است. =publics: نام توابعی که عمومی (public) هستند. .EE .UNINDENT .UNINDENT .sp مشخصه‌های زیر تبدیلات اضافی سورس عنصر منطقی را توصیف می‌کنند، به‌منظور نمایش انواع توکار (int، bool، و غیره)؛ پارامترها و آرگومان‌های استفاده‌شده هنگام نمونه‌سازی الگو (template instantiation)؛ سلسله‌مراتب نام والد؛ اطلاعات ابعاد آرایه‌ها؛ عناصر تولیدشده توسط کامپایلر؛ اندازه انواع و انواع زیرین مرتبط با نام‌های مستعار انواع (type aliases). .INDENT 7.0 .INDENT 3.5 .sp .EX =argument: پارامترهای الگو جایگزین‌شده با آرگومان‌های آن. =base: انواع پایه (int, bool, etc.). =generated: عناصر تولیدشده توسط کامپایلر. =encoded: آرگومان‌های الگو که در نام الگو کدگذاری شده‌اند. =qualified: نوع عنصر که نام والدین را در نام خود شامل می‌شود. =reference: ارجاعات به اعلان و تعریف عنصر. =size: اندازه‌ها برای انواع مرکب و پایه. =subrange: اطلاعات کدگذاری زیردامنه (subrange) برای آرایه‌ها. =typename: پارامترهای الگو (template). =underlying: نوع زیرین برای تعریف نوع‌ها (type definitions). .EE .UNINDENT .UNINDENT .sp مشخصه‌های زیر اطلاعات مکان اشکال‌زدایی (debug location) را برای یک نماد یا حوزه توصیف می‌کنند. این مشخصه‌ها شامل درصد پوشش نماد و هرگونه شکاف (gap) درون چیدمان مکان، و محدوده‌های تعیین‌کننده بخش‌های کد متصل به یک تابع هستند. هنگامی که از توصیف‌کننده‌ها استفاده شود، ثبات‌های پردازنده مقصد نمایش داده می‌شوند. .INDENT 7.0 .INDENT 3.5 .sp .EX =coverage: درصد پوشش مکان نماد. =gaps: مکان‌های اشکال‌زدایی ناموجود (شکاف‌ها). =location: مکان اشکال‌زدایی نماد. =range: محدوده‌های مکان اشکال‌زدایی. =register: نام‌های ثبات‌های پردازنده. .EE .UNINDENT .UNINDENT .sp مشخصه‌های زیر با جزئیات سطح پایین مرتبط هستند، از قبیل: آفست‌ها در فایل باینری؛ متمایزکننده‌ها (discriminators) افزوده شده به خطوط توابع درون‌خطی (inlined) برای تفکیک نمونه‌های خاص؛ ثبات‌های ماشین حالت خطوط اشکال‌زدایی؛ عناصر دور ریخته‌شده توسط کامپایلر (درون‌خطی‌سازی) یا بهینه‌سازی‌های پیونددهنده (حذف کدهای مرده یا dead\-stripping)؛ واحدهای کامپایل سیستمی تولیدشده توسط زنجیره ابزار MS در PDBها. .INDENT 7.0 .INDENT 3.5 .sp .EX =discarded: عناصر دور ریخته‌شده توسط پیونددهنده (linker). =discriminator: متمایزکننده‌ها برای نمونه‌های توابع درون‌خطی (inlined). =inserted: ارجاعات انتزاعی درون‌خطی تولیدشده. =linkage: نام پیوند (linkage) در فایل شیء. =offset: آفست اطلاعات اشکال‌زدایی. =qualifier: توصیف‌کننده‌های خط (Newstatement, BasicBlock, etc). =zero: شماره خط‌های صفر. .EE .UNINDENT .UNINDENT .sp مشخصه زیر اطلاعات خاص مربوط به قالب فایل \fBPE/COFF\fP را توصیف می‌کند. این مشخصه شامل انواع زمان اجرای MS است. .INDENT 7.0 .INDENT 3.5 .sp .EX =system: نمایش عناصر سیستمی MS مربوط به PDBها. .EE .UNINDENT .UNINDENT .sp مشخصه‌های بالا در دسته‌های \fIstandard\fP و \fIextended\fP گروه‌بندی شده‌اند که می‌توان آن‌ها را فعال کرد. .sp گروه \fIstandard\fP شامل مشخصه‌هایی است که اطلاعات کافی برای توصیف یک عنصر منطقی اضافه می‌کنند و می‌توانند موقعیت‌های عادی را در هنگام کار با اطلاعات اشکال‌زدایی پوشش دهند. .INDENT 7.0 .INDENT 3.5 .sp .EX =base =coverage =directories =discriminator =filename =files =format =language =level =producer =publics =range =reference =zero .EE .UNINDENT .UNINDENT .sp گروه \fIextended\fP شامل مشخصه‌هایی است که نیازمند دانش عمیق‌تری درباره اطلاعات اشکال‌زدایی هستند. این مشخصه‌ها زمانی کاربرد دارند که سطح پایین‌تر و دقیق‌تری از جزئیات مورد نیاز باشد. .INDENT 7.0 .INDENT 3.5 .sp .EX =argument =discarded =encoded =gaps =generated =global =inserted =linkage =local =location =offset =operation =pathname =qualified =qualifier =register =size =subrange =system =typename .EE .UNINDENT .UNINDENT .UNINDENT.SS "چاپ (PRINT)" .sp گزینه‌های زیر عنصرهایی را که باید چاپ شوند توصیف می‌کنند. چیدمان مورد استفاده توسط \fB\-\-report\fP مشخص می‌شود. در چیدمان درختی، تمام عنصرها حوزه‌های لغوی دربرگیرنده خود را چاپ می‌کنند، حتی زمانی که به‌طور صریح مشخص نشده باشند. .INDENT 0.0 .TP .B \-\-print= که در آن \fBvalue\fP یکی از گزینه‌های فهرست‌های زیر است. .INDENT 7.0 .INDENT 3.5 .sp .EX =all: تمام ویژگی‌های زیر را شامل می‌شود. .EE .UNINDENT .UNINDENT .sp گزینه‌های زیر عنصرهای درخواستی را چاپ می‌کنند؛ در صورت تعیین هرگونه شرایط انتخاب (\fB\-\-select\fP)، تنها عنصرهایی که با آن‌ها مطابقت داشته باشند چاپ خواهند شد. مقدار \fBelements\fP روشی مناسب برای مشخص کردن هم‌زمان دستورالعمل‌ها، خطوط، حوزه‌ها، نمادها و انواع است. .INDENT 7.0 .INDENT 3.5 .sp .EX =elements: دستورالعمل‌ها، خطوط، حوزه‌ها، نمادها و انواع. =instructions: دستورالعمل‌های اسمبلی برای بخش‌های کد. =lines: خطوط مبدأ ارجاع داده‌شده در اطلاعات اشکال‌زدایی. =scopes: بلوک‌های لغوی (تابع، کلاس، فضای نام و غیره). =symbols: نمادها (متغیر، عضو، پارامتر و غیره). =types: انواع (اشاره‌گر، ارجاع، نام مستعار نوع و غیره). .EE .UNINDENT .UNINDENT .sp گزینه‌های زیر اطلاعات جمع‌آوری‌شده در حین ایجاد عنصرها را چاپ می‌کنند، از قبیل: سهم حوزه‌ها در اطلاعات اشکال‌زدایی؛ خلاصه عنصرهای ایجادشده، چاپ‌شده یا تطبیق‌یافته (\fB\-\-select\fP)؛ هشدارهای تولیدشده در حین ایجاد نما. .INDENT 7.0 .INDENT 3.5 .sp .EX =sizes: سهم حوزه‌ها در اطلاعات اشکال‌زدایی. =summary: خلاصه عنصرهای تخصیص‌یافته، انتخاب‌شده یا چاپ‌شده. =warnings: هشدارهای شناسایی‌شده. .EE .UNINDENT .UNINDENT .sp نکته: گزینه \fB\-\-print=sizes\fP مختص ELF است. .UNINDENT .SS "خروجی (OUTPUT)" .sp گزینه‌های زیر نحوه کنترل خروجی تولیدشده هنگام چاپ عنصرهای منطقی را توصیف می‌کنند. .INDENT 0.0 .TP .B \-\-output\-file= تغییر مسیر خروجی به فایلی که با مشخص می‌شود، که در آن \- نشان‌دهنده جریان خروجی استاندارد است. .UNINDENT .sp دستور \fBllvm\-debuginfo\-analyzer\fP دارای مفهوم «نمای تفکیک‌شده» (\fBsplit view\fP) است. هنگام تغییر مسیر خروجی از یک قالب باینری پیچیده، خروجی به فایل‌های مجزا \fBتقسیم می‌شود\fP که هر کدام شامل خروجی نمای منطقی برای یک واحد ترجمه (compilation unit) مجزا است. .INDENT 0.0 .TP .B \-\-output\-folder= پوشه‌ای برای نوشتن یک فایل به ازای هر واحد ترجمه، در صورتی که \fB\-\-output=split\fP مشخص شده باشد. .UNINDENT .INDENT 0.0 .TP .B \-\-output\-level= تنها عنصرهایی را چاپ می‌کند که تا مقدار \fBسطح لغوی\fP (\fBlexical level\fP) مشخص‌شده باشند. فایل ورودی در سطح لغوی صفر و یک واحد ترجمه در سطح لغوی یک قرار دارد. .UNINDENT .INDENT 0.0 .TP .B \-\-output= که در آن \fBvalue\fP یکی از گزینه‌های فهرست‌های زیر است. .INDENT 7.0 .INDENT 3.5 .sp .EX =all: تمام خروجی‌های زیر را شامل می‌شود. .EE .UNINDENT .UNINDENT .INDENT 7.0 .INDENT 3.5 .sp .EX =json: استفاده از JSON به عنوان قالب خروجی (پیاده‌سازی نشده است). =split: تفکیک خروجی بر اساس واحدهای ترجمه (Compile Units). =text: استفاده از خروجی متنی با فرم آزاد. .EE .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B \-\-output\-sort= کلید اصلی هنگام مرتب‌سازی عنصرها در خروجی (پیش‌فرض: line). مرتب‌سازی بر اساس نوع عنصر منطقی، مستلزم آشنایی با گزینه‌های انتخاب نوع عنصر (\fB\-\-select\-lines\fP، \fB\-\-select\-scopes\fP، \fB\-\-select\-symbols\fP، \fB\-\-select\-types\fP) است، زیرا آن گزینه‌ها انواع مختلف عنصرهای منطقی را توصیف می‌کنند. .INDENT 7.0 .INDENT 3.5 .sp .EX =none: خروجی بدون مرتب‌سازی (همان‌گونه که از ورودی خوانده شده است). =id: مرتب‌سازی بر اساس شناسه یکتای عنصر. =kind: مرتب‌سازی بر اساس نوع عنصر. =line: مرتب‌سازی بر اساس شماره خط عنصر. =name: مرتب‌سازی بر اساس نام عنصر. =offset: مرتب‌سازی بر اساس آفست عنصر. .EE .UNINDENT .UNINDENT .UNINDENT.SS گزارش (REPORT) .sp بسته به وظیفه‌ای که اجرا می‌شود (print،‏ compare،‏ select)، چندین طرح‌بندی برای نمایش عناصر به شکلی مناسب‌تر پشتیبانی می‌شوند تا درک خروجی آسان‌تر گردد. .INDENT 0.0 .TP .B \-\-report= به‌طوری‌که \fBvalue\fP یکی از گزینه‌های فهرست زیر باشد. .INDENT 7.0 .INDENT 3.5 .sp .EX =all: شامل تمام گزارش‌های زیر. .EE .UNINDENT .UNINDENT .INDENT 7.0 .INDENT 3.5 .sp .EX =children: عناصر و فرزندان در قالب درختی نمایش داده می‌شوند. =list: عناصر در قالب جدولی نمایش داده می‌شوند. =parents: عناصر و والدین در قالب درختی نمایش داده می‌شوند. =view: عناصر، والدین و فرزندان در قالب درختی نمایش داده می‌شوند. .EE .UNINDENT .UNINDENT .UNINDENT .sp طرح‌بندی \fBlist\fP عناصر منطقی را در قالبی جدولی و بدون هیچ‌گونه رابطهٔ والد\-فرزندی نمایش می‌دهد. این روش هنگام مقایسهٔ نماهای منطقی، می‌تواند روش ارجح برای نمایش عناصری باشد که با شرایط خاصی مطابقت دارند، و پیدا کردن تفاوت‌ها را آسان‌تر می‌کند. .sp طرح‌بندی‌های \fBchildren\fP، \fBparents\fP و \fBview\fP عناصر را در یک قالب درختی نمایش می‌دهند؛ به‌طوری‌که حوزه‌ها (scopes) گره‌های آن، و انواع (types)، نمادها (symbols)، خطوط (lines) و سایر حوزه‌ها فرزندان آن‌ها را تشکیل می‌دهند. این طرح‌بندی، رابطهٔ حوزهٔ واژگانی (lexical scoping) میان عناصر را نشان می‌دهد که در آن فایل باینری ریشهٔ درخت (سطح 0) و هر واحد ترجمه (compilation unit) یک فرزند (سطح 1) است. .sp طرح‌بندی \fBchildren\fP شامل عناصری است که با هر یک از معیارهای تعیین‌شده (\fB\-\-select\fP) یا (\fB\-\-compare\fP) مطابقت دارند، به همراه فرزندان آن‌ها. .sp طرح‌بندی \fBparents\fP شامل عناصری است که با هر یک از معیارهای تعیین‌شده (\fB\-\-select\fP) یا (\fB\-\-compare\fP) مطابقت دارند، به همراه والدین آن‌ها. .sp طرح‌بندی ترکیبی \fBview\fP شامل عناصری است که با هر یک از معیارهای تعیین‌شده (\fB\-\-select\fP) یا (\fB\-\-compare\fP) مطابقت دارند، به همراه والدین و فرزندان آن‌ها. .sp \fBنکات\fP: .INDENT 0.0 .IP 1. 3 هنگامی که یک معیار گزینش (\fB\-\-select\fP) بدون مشخص کردن گزینهٔ گزارش تعیین شود، طرح‌بندی \fBlist\fP انتخاب می‌شود. .IP 2. 3 حالت مقایسه همواره از طرح‌بندی \fBview\fP استفاده می‌کند. .UNINDENT .SS گزینش (SELECTION) .sp هنگام چاپ یک عنصر، داده‌های گوناگونی را می‌توان لحاظ کرد و این اطلاعات (\fB\-\-attribute\fP) از داده‌های مستقیماً مرتبط با فایل باینری (افست) گرفته تا جزئیات سطح بالا مانند پوشش، سطح حوزهٔ واژگانی و مکان را در بر می‌گیرد. با توجه به اینکه خروجی چاپ‌شده ممکن است به اندازهٔ قابل‌توجهی برسد، چندین گزینهٔ گزینش، امکان چاپ عناصری مشخص را فراهم می‌کنند. .sp تطبیق الگو می‌تواند به حروف کوچک و بزرگ حساس نباشد (\fB\-\-select\-nocase\fP) و برای استفاده از عبارات باقاعده گسترش یابد (\fB\-\-select\-regex\fP). .SS عناصر (ELEMENTS) .sp گزینه‌های زیر امکان چاپ عناصری را فراهم می‌کنند که با ، مقدار افست یا یک عنصر داده‌شده مطابقت دارند. .INDENT 0.0 .TP .B \-\-select= چاپ تمام عناصری که نام یا شماره خط آن‌ها با داده‌شده مطابقت دارد. .UNINDENT .INDENT 0.0 .TP .B \-\-select\-offsets= چاپ تمام عناصری که افست آن‌ها با مقادیر داده‌شده مطابقت دارد. گزینهٔ \fB\-\-attribute\fP را ببینید. .UNINDENT .INDENT 0.0 .TP .B \-\-select\-elements= چاپ تمام عناصری که داده‌شده را برآورده می‌کنند؛ به‌طوری‌که \fBcondition\fP یکی از گزینه‌های فهرست زیر باشد. .INDENT 7.0 .INDENT 3.5 .sp .EX =discarded: عناصر کنار گذاشته‌شده توسط پیونددهنده (linker). =global: عنصری که در چندین واحد ترجمه به آن ارجاع داده شده است. =optimized: ارجاعات انتزاعی درون‌خطی‌شدهٔ بهینه‌سازی‌شده. .EE .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .TP .B \-\-select\-nocase هنگام استفاده از \fB\-\-select\fP، تطبیق الگو به حروف بزرگ و کوچک حساس نیست\&. .UNINDENT .INDENT 0.0 .TP .B \-\-select\-regex هنگام گزینش با گزینهٔ \fB\-\-select\fP، با هر رشتهٔ به عنوان یک عبارت باقاعده رفتار می‌کند. اگر \fB\-\-select\-nocase\fP مشخص شده باشد، عبارت باقاعده به حروف بزرگ و کوچک حساس نخواهد بود. .UNINDENT .sp اگر معیار بیش از حد عمومی باشد، می‌توان گزینهٔ دقیق‌تری را برای هدف قرار دادن دسته‌بندی خاصی از عناصر تعیین کرد: خطوط (\fB\-\-select\-lines\fP)، حوزه‌ها (\fB\-\-select\-scopes\fP)، نمادها (\fB\-\-select\-symbols\fP) و انواع (\fB\-\-select\-types\fP). .sp این گزینه‌ها نیازمند آگاهی از قالب اطلاعات اشکال‌زدایی (DWARF،‏ CodeView) هستند، زیرا \fBkind\fP داده‌شده، نوع بسیار خاصی از عناصر را توصیف می‌کند..SS "سطرها (LINES)" .sp گزینه‌های زیر امکان چاپ سطرهایی را فراهم می‌کنند که با داده‌شده مطابقت دارند. معیار ارائه‌شده، ثبات‌های ماشین حالت debug line را توصیف می‌کند. .INDENT 0.0 .TP .B \-\-select\-lines= به‌طوری که \fBkind\fP یکی از گزینه‌های فهرست زیر باشد. .INDENT 7.0 .INDENT 3.5 .sp .EX =AlwaysStepInto: یک پرش همیشگی به درون (always step into) را علامت‌گذاری می‌کند. =BasicBlock: یک بلوک پایه‌ای (basic block) جدید را علامت‌گذاری می‌کند. =Discriminator: سطری که دارای یک تفکیک‌کننده (discriminator) است. =EndSequence: پایان توالی سطرها را علامت‌گذاری می‌کند. =EpilogueBegin: آغاز بخش پایانی (epilogue) تابع را علامت‌گذاری می‌کند. =LineAssembler: سطرهایی که متناظر با متن دیس‌اسمبلی هستند. =LineDebug: سطرهایی که متناظر با سطرهای اشکال‌زدایی (debug lines) هستند. =NeverStepInto: یک عدم پرش به درون (never step into) را علامت‌گذاری می‌کند. =NewStatement: یک عبارت (statement) جدید را علامت‌گذاری می‌کند. =PrologueEnd: پایان بخش آغازین (prologue) تابع را علامت‌گذاری می‌کند. .EE .UNINDENT .UNINDENT .UNINDENT .SS "حوزه‌ها (SCOPES)" .sp گزینه‌های زیر امکان چاپ حوزه‌هایی را فراهم می‌کنند که با داده‌شده مطابقت دارند. .INDENT 0.0 .TP .B \-\-select\-scopes= به‌طوری که \fBkind\fP یکی از گزینه‌های فهرست زیر باشد. .INDENT 7.0 .INDENT 3.5 .sp .EX =Aggregate: یک کلاس، ساختار یا اجتماع (union). =Array: یک آرایه. =Block: یک بلوک عمومی (بلوک واژگانی یا بلوک استثنا). =CallSite: یک محل فراخوانی (call site). =CatchBlock: یک بلوک استثنا (catch block). =Class: یک کلاس. =CompileUnit: یک واحد کامپایل (compile unit). =EntryPoint: یک نقطهٔ ورود زیرروال (subroutine). =Enumeration: یک شمارش (enumeration). =Function: یک تابع. =FunctionType: یک اشاره‌گر تابع (function pointer). =InlinedFunction: یک تابع درون‌خطی (inlined function). =Label: یک برچسب (label). =LexicalBlock: یک بلوک واژگانی (lexical block). =Module: یک ماژول. =Namespace: یک فضای نام (namespace). =Root: عنصری که نمایانگر حوزهٔ اصلی (main scope) است. =Structure: یک ساختار (structure). =Subprogram: یک زیربرنامه (subprogram). =Template: یک تعریف الگو (template). =TemplateAlias: یک نام مستعار الگو (template alias). =TemplatePack: یک بسته الگو (template pack). =TryBlock: یک بلوک استثنای try. =Union: یک اجتماع (union). .EE .UNINDENT .UNINDENT .UNINDENT .SS "نمادها (SYMBOLS)" .sp گزینه‌های زیر امکان چاپ نمادهایی را فراهم می‌کنند که با داده‌شده مطابقت دارند. .INDENT 0.0 .TP .B \-\-select\-symbols= به‌طوری که \fBkind\fP یکی از گزینه‌های فهرست زیر باشد. .INDENT 7.0 .INDENT 3.5 .sp .EX =CallSiteParameter: یک پارامتر محل فراخوانی (call site). =Constant: یک نماد ثابت (constant). =Inheritance: یک کلاس پایه (base class). =Member: یک کلاس عضو (member class). =Parameter: یک پارامتر برای تابع. =Unspecified: پارامترهای نامشخص برای تابع. =Variable: یک متغیر. .EE .UNINDENT .UNINDENT .UNINDENT.SS انواع (TYPES) .sp گزینه‌های زیر امکان چاپ نوع‌هایی را فراهم می‌کنند که با مشخص‌شده مطابقت دارند. .INDENT 0.0 .TP .B \-\-select\-types= به طوری که \fBkind\fP یکی از گزینه‌های فهرست زیر باشد: .INDENT 7.0 .INDENT 3.5 .sp .EX =Base: نوع پایه (عدد صحیح، بولی و غیره). =Const: مشخص‌گر ثابت (const). =Enumerator: مقدار شمارشی (Enumerator). =Import: اعلان واردسازی (import). =ImportDeclaration: اعلان واردسازی. =ImportModule: ماژول واردسازی. =Pointer: نوع اشاره‌گر. =PointerMember: اشاره‌گر به تابع عضو. =Reference: نوع مرجع. =Restrict: مشخص‌گر restrict. =RvalueReference: مرجع مقدار راست (R\-value reference). =Subrange: زیربازه آرایه. =TemplateParam: پارامتر الگو. =TemplateTemplateParam: پارامتر الگوی الگو. =TemplateTypeParam: پارامتر نوع الگو. =TemplateValueParam: پارامتر مقدار الگو. =Typedef: تعریف نوع (typedef). =Unspecified: نوع مشخص‌نشده. =Volatile: مشخص‌گر فرار (volatile). .EE .UNINDENT .UNINDENT .UNINDENT .SS مقایسه (COMPARE) .sp هنگام کار با اطلاعات اشکال‌زدایی (debug information)، موقعیت‌هایی وجود دارد که چاپ صرف عناصر، رویکرد مناسبی نیست. این حالت زمانی رخ می‌دهد که بررسی تأثیرات ناشی از نسخه‌های مختلف یک زنجیره‌ابزار یکسان، یا اثر بهینه‌سازی‌های خاص کامپایلر مد نظر باشد. .sp در چنین مواردی، به دنبال آن هستیم که ببینیم چه عناصری افزوده یا حذف شده‌اند. با توجه به قالب پیچیده اطلاعات اشکال‌زدایی، استفاده از یک ابزار diff معمولی برای یافتن این عناصر بسیار دشوار و هنگام کار با قالب‌های اشکال‌زدایی متفاوت، حتی ناممکن است. .sp ابزار \fBllvm\-debuginfo\-analyzer\fP از مقایسه منطقی عناصر پشتیبانی می‌کند که امکان یافتن تفاوت‌های معنایی بین نماهای منطقیِ تولیدشده توسط نسخه‌های مختلف زنجیره‌ابزار یا حتی قالب‌های اطلاعات اشکال‌زدایی گوناگون را فراهم می‌سازد. .sp هنگام مقایسه نماهای منطقیِ ایجادشده از قالب‌های اشکال‌زدایی متفاوت، دقت مقایسه به این بستگی دارد که اطلاعات اشکال‌زدایی تا چه اندازه کد کاربر را دقیق بازنمایی می‌کنند. به عنوان مثال، یک نمای منطقی ایجادشده از یک فایل باینری با اطلاعات اشکال‌زدایی DWARF ممکن است شامل داده‌های دقیق‌تری نسبت به یک نمای منطقی ایجادشده از یک فایل باینری با اطلاعات اشکال‌زدایی CodeView باشد. .sp گزینه‌های زیر عناصر مورد مقایسه را شرح می‌دهند. .INDENT 0.0 .TP .B \-\-compare= به طوری که \fBvalue\fP یکی از گزینه‌های فهرست زیر باشد: .INDENT 7.0 .INDENT 3.5 .sp .EX =all: شامل تمام عناصر زیر. .EE .UNINDENT .UNINDENT .INDENT 7.0 .INDENT 3.5 .sp .EX =lines: شامل خط‌ها. =scopes: شامل حوزه‌ها. =symbols: شامل نمادها. =types: شامل انواع. .EE .UNINDENT .UNINDENT .UNINDENT .sp ابزار \fBllvm\-debuginfo\-analyzer\fP نخستین فایل باینری در خط فرمان را به عنوان \fBreference\fP (مرجع) و فایل دوم را به عنوان \fBtarget\fP (هدف) در نظر می‌گیرد\&. برای دستیابی به گزارشی توصیفی‌تر، مقایسه دو بار انجام می‌شود. نماهای مرجع و هدف جابه‌جا می‌شوند تا آن دسته از عناصر \fBmissing\fP (مفقود) از نمای هدف و عناصر \fBadded\fP (افزوده‌شده) به نمای مرجع مشخص شوند. .sp برای چگونگی شرح گزارش‌های مقایسه، گزینه‌های \fB\-\-report\fP را ببینید..SS "هشدار (WARNING)" .sp هنگام خواندن فایل‌های شیء ورودی، \fBllvm\-debuginfo\-analyzer\fP می‌تواند مشکلاتی را در اطلاعات اشکال‌زدایی خام شناسایی کند. ممکن است این موارد برای هدفِ چاپ یک نمای منطقی مهلک تلقی نشوند، اما می‌توانند نشانه‌ای از کیفیت بوده و به‌طور بالقوه مشکلاتی را در اطلاعات اشکال‌زدایی تولیدشده آشکار سازند. .sp گزینه‌های زیر هشدارهایی را شرح می‌دهند که در صورت درخواست توسط \fB\-\-print\fP\&، برای چاپ بعدی ثبت می‌شوند. .INDENT 0.0 .TP .B \-\-warning= که در آن \fBvalue\fP یکی از گزینه‌های فهرست زیر است. .INDENT 7.0 .INDENT 3.5 .sp .EX =all: شامل تمام هشدارهای زیر. .EE .UNINDENT .UNINDENT .sp گزینه‌های زیر اطلاعات بیشتری را در طول ایجاد نمای منطقی جمع‌آوری می‌کنند، از جمله مقادیر نامعتبر پوشش و مکان‌ها برای نمادها؛ محدوده‌های نامعتبر کد؛ و خطوطی که صفر هستند. .INDENT 7.0 .INDENT 3.5 .sp .EX =coverages: مقادیر نامعتبر پوشش نماد. =lines: خطوط اشکال‌زدایی با مقدار صفر. =locations: مکان‌های نامعتبر نماد. =ranges: محدوده‌های نامعتبر کد. .EE .UNINDENT .UNINDENT .UNINDENT .SS "داخلی (INTERNAL)" .INDENT 0.0 .INDENT 3.5 برای درک بهتر نمای منطقی، ممکن است دسترسی به اطلاعات داخلی دقیق‌تر مورد نیاز باشد. چنین داده‌هایی به شناسایی اطلاعات اشکال‌زدایی پردازش‌شده یا مدیریت نادرست عناصر منطقی کمک می‌کنند. معمولاً این دسته از گزینه‌ها تنها در ساخت‌های \fIdebug\fP در دسترس هستند. .sp \fBllvm\-debuginfo\-analyzer\fP از این گزینه‌های پیشرفته در هر دو ساخت \fIrelease\fP و \fIdebug\fP پشتیبانی می‌کند. .UNINDENT .UNINDENT .INDENT 0.0 .TP .B \-\-internal= که در آن \fBvalue\fP یکی از گزینه‌های فهرست زیر است. .INDENT 7.0 .INDENT 3.5 .sp .EX =all: شامل تمام گزینه‌های زیر. .EE .UNINDENT .UNINDENT .sp گزینه‌های زیر امکان بررسی یکپارچگی نمای منطقی را فراهم می‌کنند؛ برچسب‌های اشکال‌زدایی که پردازش شده یا پیاده‌سازی نشده‌اند را جمع‌آوری می‌کنند؛ شماره خط عنصر منطقی را نادیده می‌گیرند تا مقایسه نمای منطقی هنگام استفاده از ابزارهای مقایسه خارجی آسان‌تر شود؛ و گزینه‌های خط فرمانی را که برای فراخوانی \fBllvm\-debuginfo\-analyzer\fP استفاده شده‌اند، چاپ می‌کنند. .INDENT 7.0 .INDENT 3.5 .sp .EX =id: چاپ شناسه یکتای عنصر. =cmdline: چاپ خط فرمان. =integrity: بررسی یکپارچگی عناصر. =none: نادیده گرفتن شماره خط عنصر. =tag: برچسب‌های اطلاعات اشکال‌زدایی. .EE .UNINDENT .UNINDENT .sp \fBنکته:\fP برای قالب ELF، برچسب‌های جمع‌آوری‌شده نشان‌دهنده برچسب‌های اشکال‌زدایی هستند که پردازش نشده‌اند. برای قالب PE/COFF، آن‌ها نشان‌دهنده برچسب‌هایی هستند که پردازش شده‌اند. .UNINDENT.SH "مثال‌ها (EXAMPLES)" .sp این بخش شامل چند فایل باینری واقعی است تا نحوه استفاده از \fBllvm\-debuginfo\-analyzer\fP را برای چاپ یک نمای منطقی و تشخیص مشکلات احتمالی اطلاعات اشکال‌زدایی نشان دهد. .SS "مورد آزمون ۱ \- گزینه‌های عمومی (TEST CASE 1 \- GENERAL OPTIONS)" .sp مثال زیر برای نشان دادن خروجی‌های متفاوتی که توسط \fBllvm\-debuginfo\-analyzer\fP\& تولید می‌شود به کار رفته است. ما این مثال را برای یک هدف X86 ELF با Clang (\-O0 \-g) کامپایل کرده‌ایم: .INDENT 0.0 .INDENT 3.5 .sp .EX 1 using INTPTR = const int *; 2 int foo(INTPTR ParamPtr, unsigned ParamUnsigned, bool ParamBool) { 3 if (ParamBool) { 4 typedef int INTEGER; 5 const INTEGER CONSTANT = 7; 6 return CONSTANT; 7 } 8 return ParamUnsigned; 9 } .EE .UNINDENT .UNINDENT .SS "حالت چاپ (PRINTING MODE)" .sp در این حالت \fBllvm\-debuginfo\-analyzer\fP \fIنمای منطقی\fP یا بخش‌هایی از آن را بر اساس الگوهای معیار (شامل عبارات باقاعده) برای انتخاب نوع \fIعناصر منطقی\fP که باید در خروجی گنجانده شوند، چاپ می‌کند. .SS "جزئیات پایه (BASIC DETAILS)" .sp دستور زیر جزئیات پایه‌ای را برای تمام عناصر منطقی مرتب‌شده بر اساس آفست داخلی اطلاعات اشکال‌زدایی چاپ می‌کند؛ این شامل سطح واژگانی (lexical level) و قالب اطلاعات اشکال‌زدایی آن است. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level,format \-\-output\-sort=offset \-\-print=scopes,symbols,types,lines,instructions test\-dwarf\-clang.o .EE .UNINDENT .UNINDENT .sp یا .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level,format \-\-output\-sort=offset \-\-print=elements test\-dwarf\-clang.o .EE .UNINDENT .UNINDENT .sp هر ردیف نشان‌دهنده عنصری است که در اطلاعات اشکال‌زدایی وجود دارد. ستون نخست نشان‌دهنده سطح دامنه (scope level) است که پس از آن شماره خط مربوطه (در صورت وجود) و در نهایت شرح عنصر می‌آید. .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqtest\-dwarf\-clang.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqtest.cpp\(aq [002] 2 {Function} extern not_inlined \(aqfoo\(aq \-> \(aqint\(aq [003] 2 {Parameter} \(aqParamPtr\(aq \-> \(aqINTPTR\(aq [003] 2 {Parameter} \(aqParamUnsigned\(aq \-> \(aqunsigned int\(aq [003] 2 {Parameter} \(aqParamBool\(aq \-> \(aqbool\(aq [003] {Block} [004] 5 {Variable} \(aqCONSTANT\(aq \-> \(aqconst INTEGER\(aq [004] 5 {Line} [004] {Code} \(aqmovl $0x7, \-0x1c(%rbp)\(aq [004] 6 {Line} [004] {Code} \(aqmovl $0x7, \-0x4(%rbp)\(aq [004] {Code} \(aqjmp 0x6\(aq [004] 8 {Line} [004] {Code} \(aqmovl \-0x14(%rbp), %eax\(aq [003] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq [003] 2 {Line} [003] {Code} \(aqpushq %rbp\(aq [003] {Code} \(aqmovq %rsp, %rbp\(aq [003] {Code} \(aqmovb %dl, %al\(aq [003] {Code} \(aqmovq %rdi, \-0x10(%rbp)\(aq [003] {Code} \(aqmovl %esi, \-0x14(%rbp)\(aq [003] {Code} \(aqandb $0x1, %al\(aq [003] {Code} \(aqmovb %al, \-0x15(%rbp)\(aq [003] 3 {Line} [003] {Code} \(aqtestb $0x1, \-0x15(%rbp)\(aq [003] {Code} \(aqje 0x13\(aq [003] 8 {Line} [003] {Code} \(aqmovl %eax, \-0x4(%rbp)\(aq [003] 9 {Line} [003] {Code} \(aqmovl \-0x4(%rbp), %eax\(aq [003] {Code} \(aqpopq %rbp\(aq [003] {Code} \(aqretq\(aq [003] 9 {Line} [002] 1 {TypeAlias} \(aqINTPTR\(aq \-> \(aq* const int\(aq .EE .UNINDENT .UNINDENT .sp با بررسی دقیق‌تر، می‌توانیم ببینیم چه چیزی می‌تواند یک مشکل بالقوه در اشکال‌زدایی باشد: .INDENT 0.0 .INDENT 3.5 .sp .EX [003] {Block} [003] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq .EE .UNINDENT .UNINDENT .sp تعریف \fB\(aqINTEGER\(aq\fP در سطح \fB[003]\fP است، یعنی همان دامنه واژگانی \fB{Block}\fP ناشناس (شاخه \(aqtrue\(aq برای دستور \(aqif\(aq)، در حالی که در کد منبع اصلی دستور typedef مشخصاً درون آن بلوک قرار دارد؛ بنابراین تعریف \fB\(aqINTEGER\(aq\fP نیز باید در سطح \fB[004]\fP در داخل بلوک باشد..SS "انتخاب عناصر منطقی (SELECT LOGICAL ELEMENTS)" .sp دستور زیر تمام \fIinstructions\fP، \fIsymbols\fP و \fItypes\fP که حاوی \fB\(aqinte\(aq\fP یا \fB\(aqmovl\(aq\fP در نام یا نوع خود هستند را با استفاده از قالب‌بندی ستونی (tab layout) و با نمایش تعداد موارد منطبق، چاپ می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level \-\-select\-nocase \-\-select\-regex \-\-select=INTe \-\-select=movl \-\-report=list \-\-print=symbols,types,instructions,summary test\-dwarf\-clang.o Logical View: [000] {File} \(aqtest\-dwarf\-clang.o\(aq [001] {CompileUnit} \(aqtest.cpp\(aq [003] {Code} \(aqmovl $0x7, \-0x1c(%rbp)\(aq [003] {Code} \(aqmovl $0x7, \-0x4(%rbp)\(aq [003] {Code} \(aqmovl %eax, \-0x4(%rbp)\(aq [003] {Code} \(aqmovl %esi, \-0x14(%rbp)\(aq [003] {Code} \(aqmovl \-0x14(%rbp), %eax\(aq [003] {Code} \(aqmovl \-0x4(%rbp), %eax\(aq [003] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq [004] 5 {Variable} \(aqCONSTANT\(aq \-> \(aqconst INTEGER\(aq \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Element Total Found \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Scopes 3 0 Symbols 4 1 Types 2 1 Lines 17 6 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Total 26 8 .EE .UNINDENT .UNINDENT .SS "حالت مقایسه (COMPARISON MODE)" .sp در این حالت، \fBllvm\-debuginfo\-analyzer\fP نماهای منطقی (logical views) را برای ایجاد گزارشی از عناصر منطقیِ مفقود یا اضافه‌شده مقایسه می‌کند. این قابلیت یک ابزار بسیار قدرتمند برای یافتن تفاوت‌های معنایی در اطلاعات اشکال‌زدایی تولیدشده توسط نسخه‌های مختلف زنجیره ابزار (toolchain) یا حتی زنجیره‌های ابزار کاملاً متفاوت است (به عنوان مثال، کامپایلری که DWARF تولید می‌کند را می‌توان مستقیماً با کامپایلر کاملاً متفاوتی که CodeView تولید می‌کند مقایسه کرد). .sp با توجه به مثال قبلی، ما با مقایسه در برابر یک کامپایلر دیگر، مشکل اطلاعات اشکال‌زدایی فوق (مربوط به مکان نامعتبر قبلی حوزه برای \fB\(aqtypedef int INTEGER\(aq\fP) را شناسایی کردیم. .sp با استفاده از GCC برای تولید test\-dwarf\-gcc.o، می‌توانیم یک الگوی گزینش را همراه با حالت چاپ اعمال کنیم تا خروجی نمای منطقی زیر به دست آید. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level \-\-select\-regex \-\-select\-nocase \-\-select=INTe \-\-report=list \-\-print=symbols,types test\-dwarf\-clang.o test\-dwarf\-gcc.o Logical View: [000] {File} \(aqtest\-dwarf\-clang.o\(aq [001] {CompileUnit} \(aqtest.cpp\(aq [003] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq [004] 5 {Variable} \(aqCONSTANT\(aq \-> \(aqconst INTEGER\(aq Logical View: [000] {File} \(aqtest\-dwarf\-gcc.o\(aq [001] {CompileUnit} \(aqtest.cpp\(aq [004] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq [004] 5 {Variable} \(aqCONSTANT\(aq \-> \(aqconst INTEGER\(aq .EE .UNINDENT .UNINDENT .sp خروجی نشان می‌دهد که هر دو شیء شامل عناصر یکسانی هستند، اما \fB\(aqtypedef INTEGER\(aq\fP در سطح حوزه (scope level) متفاوتی قرار دارد. شیء تولیدشده توسط GCC مقدار \fB\(aq4\(aq\fP را نشان می‌دهد که مقدار صحیح است. .sp توجه داشته باشید که برای انجام مقایسه، الزامی مبنی بر اینکه GCC حتماً باید DWARF یکسان یا مشابهی با Clang تولید کند وجود ندارد. ما تنها معناشناسی (semantics) را مقایسه می‌کنیم. همین موضوع هنگام مقایسه اطلاعات اشکال‌زدایی CodeView تولیدشده توسط MSVC و Clang نیز صدق می‌کند. .sp ۲ روش برای مقایسه وجود دارد: نمای منطقی (logical view) و عناصر منطقی (logical elements)..SS "نمای منطقی (LOGICAL VIEW)" .sp این بخش نمای منطقی را به‌عنوان یک کلِ واحد مقایسه می‌کند؛ برای برقراری تطابق، هر عنصر منطقیِ مقایسه‌شده باید والدین و فرزندان یکسانی داشته باشد. .sp با استفاده از قابلیت مقایسه \fBllvm\-debuginfo\-analyzer\fP، می‌توان آن مسئله را در بستری کلی‌تر که می‌تواند شامل نمای منطقی نیز باشد، مشاهده کرد. .sp خروجی در قالب نما، عناصر \fBمفقود (\-) و افزوده‌شده (+)\fP را نشان می‌دهد، و با جابه‌جا کردن فایل‌های شیءِ مرجع و هدف، زمینه بیشتری فراهم می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level \-\-compare=types \-\-report=view \-\-print=symbols,types test\-dwarf\-clang.o test\-dwarf\-gcc.o Reference: \(aqtest\-dwarf\-clang.o\(aq Target: \(aqtest\-dwarf\-gcc.o\(aq Logical View: [000] {File} \(aqtest\-dwarf\-clang.o\(aq [001] {CompileUnit} \(aqtest.cpp\(aq [002] 1 {TypeAlias} \(aqINTPTR\(aq \-> \(aq* const int\(aq [002] 2 {Function} extern not_inlined \(aqfoo\(aq \-> \(aqint\(aq [003] {Block} [004] 5 {Variable} \(aqCONSTANT\(aq \-> \(aqconst INTEGER\(aq +[004] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq [003] 2 {Parameter} \(aqParamBool\(aq \-> \(aqbool\(aq [003] 2 {Parameter} \(aqParamPtr\(aq \-> \(aqINTPTR\(aq [003] 2 {Parameter} \(aqParamUnsigned\(aq \-> \(aqunsigned int\(aq \-[003] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq .EE .UNINDENT .UNINDENT .sp خروجی، مسیر نمای ادغام‌شده (مرجع و هدف) را به همراه عناصر مفقود و افزوده‌شده نمایش می‌دهد. .SS "عناصر منطقی (LOGICAL ELEMENTS)" .sp این بخش عناصر منطقی را به‌صورت مجزا و بدون در نظر گرفتن یکسان بودن والدین آن‌ها مقایسه می‌کند. برای هر دو روش مقایسه، معیارهای برابری شامل نام، مکان در کد منبع، نوع و سطح حوزه واژگانی (lexical scope level) است. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level \-\-compare=types \-\-report=list \-\-print=symbols,types,summary test\-dwarf\-clang.o test\-dwarf\-gcc.o Reference: \(aqtest\-dwarf\-clang.o\(aq Target: \(aqtest\-dwarf\-gcc.o\(aq (1) Missing Types: \-[003] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq (1) Added Types: +[004] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Element Expected Missing Added \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Scopes 4 0 0 Symbols 0 0 0 Types 2 1 1 Lines 0 0 0 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Total 6 1 1 .EE .UNINDENT .UNINDENT .sp تغییر ترتیب \fIReference\fP و \fITarget\fP: .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level \-\-compare=types \-\-report=list \-\-print=symbols,types,summary test\-dwarf\-gcc.o test\-dwarf\-clang.o Reference: \(aqtest\-dwarf\-gcc.o\(aq Target: \(aqtest\-dwarf\-clang.o\(aq (1) Missing Types: \-[004] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq (1) Added Types: +[003] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Element Expected Missing Added \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Scopes 4 0 0 Symbols 0 0 0 Types 2 1 1 Lines 0 0 0 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Total 6 1 1 .EE .UNINDENT .UNINDENT .sp با جابه‌جا شدن \fIReference\fP و \fITarget\fP، موارد \fIAdded Types\fP از حالت اول، اکنون در قالب \fIMissing Types\fP فهرست می‌شوند\&..SS "مورد آزمایشی ۲ \- دستورالعمل‌های اسمبلی (TEST CASE 2 \- ASSEMBLER INSTRUCTIONS)" .sp مثال زیر برای نشان دادن خروجی‌های متفاوتی که توسط \fBllvm\-debuginfo\-analyzer\fP\& تولید می‌شوند، به کار رفته است. ما این مثال را برای هدف‌های X86 Codeview و ELF با نسخه‌های اخیر Clang، GCC و MSVC (\-O0 \-g) برای Windows و Linux کامپایل کرده‌ایم. .INDENT 0.0 .INDENT 3.5 .sp .EX 1 extern int printf(const char * format, ... ); 2 3 int main() 4 { 5 printf(\(dqHello, World\en\(dq); 6 return 0; 7 } .EE .UNINDENT .UNINDENT .sp این‌ها نماهای منطقی‌ای هستند که \fBllvm\-debuginfo\-analyzer\fP برای ۳ کامپایلر مختلف (MSVC، Clang و GCC) تولید می‌کند که قالب‌های اطلاعات اشکال‌زدایی متفاوتی (CodeView، DWARF) را در Windows و Linux صادر می‌کنند. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level,format,producer \-\-print=lines,instructions hello\-world\-codeview\-clang.o hello\-world\-codeview\-msvc.o hello\-world\-dwarf\-clang.o hello\-world\-dwarf\-gcc.o .EE .UNINDENT .UNINDENT .SS CodeView \- Clang (Windows) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqhello\-world\-codeview\-clang.o\(aq \-> COFF\-x86\-64 [001] {CompileUnit} \(aqhello\-world.cpp\(aq [002] {Producer} \(aqclang version 14.0.0\(aq [002] {Function} extern not_inlined \(aqmain\(aq \-> \(aqint\(aq [003] 4 {Line} [003] {Code} \(aqsubq $0x28, %rsp\(aq [003] {Code} \(aqmovl $0x0, 0x24(%rsp)\(aq [003] 5 {Line} [003] {Code} \(aqleaq (%rip), %rcx\(aq [003] {Code} \(aqcallq 0x0\(aq [003] 6 {Line} [003] {Code} \(aqxorl %eax, %eax\(aq [003] {Code} \(aqaddq $0x28, %rsp\(aq [003] {Code} \(aqretq\(aq .EE .UNINDENT .UNINDENT .SS CodeView \- MSVC (Windows) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqhello\-world\-codeview\-msvc.o\(aq \-> COFF\-i386 [001] {CompileUnit} \(aqhello\-world.cpp\(aq [002] {Producer} \(aqMicrosoft (R) Optimizing Compiler\(aq [002] {Function} extern not_inlined \(aqmain\(aq \-> \(aqint\(aq [003] 4 {Line} [003] {Code} \(aqpushl %ebp\(aq [003] {Code} \(aqmovl %esp, %ebp\(aq [003] 5 {Line} [003] {Code} \(aqpushl $0x0\(aq [003] {Code} \(aqcalll 0x0\(aq [003] {Code} \(aqaddl $0x4, %esp\(aq [003] 6 {Line} [003] {Code} \(aqxorl %eax, %eax\(aq [003] 7 {Line} [003] {Code} \(aqpopl %ebp\(aq [003] {Code} \(aqretl\(aq .EE .UNINDENT .UNINDENT.SS DWARF \- Clang (Linux) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqhello\-world\-dwarf\-clang.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqhello\-world.cpp\(aq [002] {Producer} \(aqclang version 14.0.0\(aq [002] 3 {Function} extern not_inlined \(aqmain\(aq \-> \(aqint\(aq [003] 4 {Line} [003] {Code} \(aqpushq %rbp\(aq [003] {Code} \(aqmovq %rsp, %rbp\(aq [003] {Code} \(aqsubq $0x10, %rsp\(aq [003] {Code} \(aqmovl $0x0, \-0x4(%rbp)\(aq [003] 5 {Line} [003] {Code} \(aqmovabsq $0x0, %rdi\(aq [003] {Code} \(aqmovb $0x0, %al\(aq [003] {Code} \(aqcallq 0x0\(aq [003] 6 {Line} [003] {Code} \(aqxorl %eax, %eax\(aq [003] {Code} \(aqaddq $0x10, %rsp\(aq [003] {Code} \(aqpopq %rbp\(aq [003] {Code} \(aqretq\(aq [003] 6 {Line} .EE .UNINDENT .UNINDENT .SS DWARF \- GCC (Linux) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqhello\-world\-dwarf\-gcc.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqhello\-world.cpp\(aq [002] {Producer} \(aqGNU C++14 9.3.0\(aq [002] 3 {Function} extern not_inlined \(aqmain\(aq \-> \(aqint\(aq [003] 4 {Line} [003] {Code} \(aqendbr64\(aq [003] {Code} \(aqpushq %rbp\(aq [003] {Code} \(aqmovq %rsp, %rbp\(aq [003] 5 {Line} [003] {Code} \(aqleaq (%rip), %rdi\(aq [003] {Code} \(aqmovl $0x0, %eax\(aq [003] {Code} \(aqcallq 0x0\(aq [003] 6 {Line} [003] {Code} \(aqmovl $0x0, %eax\(aq [003] 7 {Line} [003] {Code} \(aqpopq %rbp\(aq [003] {Code} \(aqretq\(aq [003] 7 {Line} .EE .UNINDENT .UNINDENT .sp نمای منطقی، خطوط و دستورالعمل‌های اسمبلی درهم‌آمیخته را نشان می‌دهد که امکان مقایسهٔ کد تولیدشده توسط زنجیره‌ابزارهای مختلف را فراهم می‌سازد. .SS مورد آزمایشی ۳ \- حوزه واژگانی نادرست برای TYPEDEF (TEST CASE 3 \- INCORRECT LEXICAL SCOPE FOR TYPEDEF) .sp مثال زیر برای نشان دادن خروجی‌های متفاوتی که توسط \fBllvm\-debuginfo\-analyzer\fP\& تولید می‌شود، به کار رفته است. ما این مثال را برای مقصدهای X86 Codeview و ELF با نسخه‌های اخیر Clang، GCC و MSVC کامپایل کرده‌ایم (\-O0 \-g). .INDENT 0.0 .INDENT 3.5 .sp .EX 1 int bar(float Input) { return (int)Input; } 2 3 unsigned foo(char Param) { 4 typedef int INT; // ** Definition for INT ** 5 INT Value = Param; 6 { 7 typedef float FLOAT; // ** Definition for FLOAT ** 8 { 9 FLOAT Added = Value + Param; 10 Value = bar(Added); 11 } 12 } 13 return Value + Param; 14 } .EE .UNINDENT .UNINDENT .sp آزمون بالا برای نشان دادن یک مشکل حوزهٔ دید (scope) که در کامپایلر Clang یافت شده استفاده می‌شود: PR44884 (Bugs LLVM) \% / PR44229 (GitHub LLVM) \% .sp خط‌های ۴ و ۷ شامل ۲ دستور typedef هستند که در حوزه‌های واژگانی متفاوتی تعریف شده‌اند. .INDENT 0.0 .INDENT 3.5 .sp .EX 4 typedef int INT; 7 typedef float FLOAT; .EE .UNINDENT .UNINDENT .sp این‌ها نماهای منطقی‌ای هستند که \fBllvm\-debuginfo\-analyzer\fP برای ۳ کامپایلر مختلف (MSVC، Clang و GCC) تولید می‌کند که قالب‌های مختلف اطلاعات اشکال‌زدایی (CodeView، DWARF) را در بسترهای گوناگون منتشر می‌کنند. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level,format,producer \-\-print=symbols,types,lines \-\-output\-sort=kind pr\-44884\-codeview\-clang.o pr\-44884\-codeview\-msvc.o pr\-44884\-dwarf\-clang.o pr\-44884\-dwarf\-gcc.o .EE .UNINDENT .UNINDENT.SS CodeView \- Clang (ویندوز) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-44884\-codeview\-clang.o\(aq \-> COFF\-x86\-64 [001] {CompileUnit} \(aqpr\-44884.cpp\(aq [002] {Producer} \(aqclang version 14.0.0\(aq [002] {Function} extern not_inlined \(aqbar\(aq \-> \(aqint\(aq [003] {Parameter} \(aqInput\(aq \-> \(aqfloat\(aq [003] 1 {Line} [002] {Function} extern not_inlined \(aqfoo\(aq \-> \(aqunsigned\(aq [003] {Block} [004] {Variable} \(aqAdded\(aq \-> \(aqfloat\(aq [004] 9 {Line} [004] 10 {Line} [003] {Parameter} \(aqParam\(aq \-> \(aqchar\(aq [003] {TypeAlias} \(aqFLOAT\(aq \-> \(aqfloat\(aq [003] {TypeAlias} \(aqINT\(aq \-> \(aqint\(aq [003] {Variable} \(aqValue\(aq \-> \(aqint\(aq [003] 3 {Line} [003] 5 {Line} [003] 13 {Line} .EE .UNINDENT .UNINDENT .SS CodeView \- MSVC (ویندوز) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-44884\-codeview\-msvc.o\(aq \-> COFF\-i386 [001] {CompileUnit} \(aqpr\-44884.cpp\(aq [002] {Producer} \(aqMicrosoft (R) Optimizing Compiler\(aq [002] {Function} extern not_inlined \(aqbar\(aq \-> \(aqint\(aq [003] {Variable} \(aqInput\(aq \-> \(aqfloat\(aq [003] 1 {Line} [002] {Function} extern not_inlined \(aqfoo\(aq \-> \(aqunsigned\(aq [003] {Block} [004] {Block} [005] {Variable} \(aqAdded\(aq \-> \(aqfloat\(aq [004] {TypeAlias} \(aqFLOAT\(aq \-> \(aqfloat\(aq [004] 9 {Line} [004] 10 {Line} [003] {TypeAlias} \(aqINT\(aq \-> \(aqint\(aq [003] {Variable} \(aqParam\(aq \-> \(aqchar\(aq [003] {Variable} \(aqValue\(aq \-> \(aqint\(aq [003] 3 {Line} [003] 5 {Line} [003] 13 {Line} [003] 14 {Line} .EE .UNINDENT .UNINDENT .SS DWARF \- Clang (لینوکس) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-44884\-dwarf\-clang.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqpr\-44884.cpp\(aq [002] {Producer} \(aqclang version 14.0.0\(aq [002] 1 {Function} extern not_inlined \(aqbar\(aq \-> \(aqint\(aq [003] 1 {Parameter} \(aqInput\(aq \-> \(aqfloat\(aq [003] 1 {Line} [003] 1 {Line} [003] 1 {Line} [002] 3 {Function} extern not_inlined \(aqfoo\(aq \-> \(aqunsigned int\(aq [003] {Block} [004] 9 {Variable} \(aqAdded\(aq \-> \(aqFLOAT\(aq [004] 9 {Line} [004] 9 {Line} [004] 9 {Line} [004] 9 {Line} [004] 9 {Line} [004] 10 {Line} [004] 10 {Line} [004] 10 {Line} [004] 13 {Line} [003] 3 {Parameter} \(aqParam\(aq \-> \(aqchar\(aq [003] 7 {TypeAlias} \(aqFLOAT\(aq \-> \(aqfloat\(aq [003] 4 {TypeAlias} \(aqINT\(aq \-> \(aqint\(aq [003] 5 {Variable} \(aqValue\(aq \-> \(aqINT\(aq [003] 3 {Line} [003] 5 {Line} [003] 5 {Line} [003] 13 {Line} [003] 13 {Line} [003] 13 {Line} [003] 13 {Line} .EE .UNINDENT .UNINDENT.SS DWARF \- GCC (Linux) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-44884\-dwarf\-gcc.o\(aq \-> elf32\-littlearm [001] {CompileUnit} \(aqpr\-44884.cpp\(aq [002] {Producer} \(aqGNU C++14 10.2.1 20201103\(aq [002] 1 {Function} extern not_inlined \(aqbar\(aq \-> \(aqint\(aq [003] 1 {Parameter} \(aqInput\(aq \-> \(aqfloat\(aq [003] 1 {Line} [003] 1 {Line} [003] 1 {Line} [002] 3 {Function} extern not_inlined \(aqfoo\(aq \-> \(aqunsigned int\(aq [003] {Block} [004] {Block} [005] 9 {Variable} \(aqAdded\(aq \-> \(aqFLOAT\(aq [005] 9 {Line} [005] 9 {Line} [005] 9 {Line} [005] 10 {Line} [005] 13 {Line} [004] 7 {TypeAlias} \(aqFLOAT\(aq \-> \(aqfloat\(aq [003] 3 {Parameter} \(aqParam\(aq \-> \(aqchar\(aq [003] 4 {TypeAlias} \(aqINT\(aq \-> \(aqint\(aq [003] 5 {Variable} \(aqValue\(aq \-> \(aqINT\(aq [003] 3 {Line} [003] 5 {Line} [003] 13 {Line} [003] 14 {Line} [003] 14 {Line} .EE .UNINDENT .UNINDENT .sp از نماهای منطقی پیشین، می‌توان دریافت که کامپایلر Clang \fBهر دو typedef را در یک حوزه لغوی یکسان (3)\fP تولید می‌کند، که نادرست است. کامپایلرهای GCC و MSVC حوزه لغوی صحیحی را برای هر دو typedef صادر می‌کنند. .sp با استفاده از امکانات گزینش \fBllvm\-debuginfo\-analyzer\fP، می‌توانیم یک خروجی جدولی ساده ایجاد کنیم که فقط انواع منطقی را که \fBTypedef\fP هستند نشان دهد. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level,format \-\-output\-sort=name \-\-select\-types=Typedef \-\-report=list \-\-print=types pr\-44884\-*.o Logical View: [000] {File} \(aqpr\-44884\-codeview\-clang.o\(aq \-> COFF\-x86\-64 [001] {CompileUnit} \(aqpr_44884.cpp\(aq [003] {TypeAlias} \(aqFLOAT\(aq \-> \(aqfloat\(aq [003] {TypeAlias} \(aqINT\(aq \-> \(aqint\(aq Logical View: [000] {File} \(aqpr\-44884\-codeview\-msvc.o\(aq \-> COFF\-i386 [001] {CompileUnit} \(aqpr_44884.cpp\(aq [004] {TypeAlias} \(aqFLOAT\(aq \-> \(aqfloat\(aq [003] {TypeAlias} \(aqINT\(aq \-> \(aqint\(aq Logical View: [000] {File} \(aqpr\-44884\-dwarf\-clang.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqpr_44884.cpp\(aq [003] 7 {TypeAlias} \(aqFLOAT\(aq \-> \(aqfloat\(aq [003] 4 {TypeAlias} \(aqINT\(aq \-> \(aqint\(aq Logical View: [000] {File} \(aqpr\-44884\-dwarf\-gcc.o\(aq \-> elf32\-littlearm [001] {CompileUnit} \(aqpr_44884.cpp\(aq [004] 7 {TypeAlias} \(aqFLOAT\(aq \-> \(aqfloat\(aq [003] 4 {TypeAlias} \(aqINT\(aq \-> \(aqint\(aq .EE .UNINDENT .UNINDENT .sp این امر همچنین نشان می‌دهد که اطلاعات اشکال‌زدایی CodeView شماره خطوط کد منبع را برای این انواع منطقی تولید نمی‌کند. نمای منطقی بر اساس نام انواع مرتب شده است..SS مورد آزمون ۴ \- شمارش‌های تودرتوی مفقود (TEST CASE 4 \- MISSING NESTED ENUMERATIONS) .sp مثال زیر برای نشان دادن خروجی‌های متفاوتی که توسط \fBllvm\-debuginfo\-analyzer\fP\& تولید می‌شود به کار رفته است. ما این مثال را برای مقصدهای X86 Codeview و ELF با نگارش‌های اخیر Clang، GCC و MSVC کامپایل کردیم (\-O0 \-g). .INDENT 0.0 .INDENT 3.5 .sp .EX 1 struct Struct { 2 union Union { 3 enum NestedEnum { RED, BLUE }; 4 }; 5 Union U; 6 }; 7 8 Struct S; 9 int test() { 10 return S.U.BLUE; 11 } .EE .UNINDENT .UNINDENT .sp آزمون بالا برای نشان دادن یک مشکل حوزه (scope issue) یافت‌شده در کامپایلر Clang استفاده می‌شود: PR46466 (Bugs LLVM) \% / PR45811 (GitHub LLVM) \% .sp این‌ها نماهای منطقی هستند که \fBllvm\-debuginfo\-analyzer\fP برای ۳ کامپایلر مختلف (MSVC، Clang و GCC) تولید می‌کند که قالب‌های متفاوتی از اطلاعات اشکال‌زدایی (CodeView، DWARF) را روی بسترهای مختلف منتشر می‌سازند. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level,format,producer \-\-output\-sort=name \-\-print=symbols,types pr\-46466\-codeview\-clang.o pr\-46466\-codeview\-msvc.o pr\-46466\-dwarf\-clang.o pr\-46466\-dwarf\-gcc.o .EE .UNINDENT .UNINDENT .SS CodeView \- Clang (Windows) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-46466\-codeview\-clang.o\(aq \-> COFF\-x86\-64 [001] {CompileUnit} \(aqpr\-46466.cpp\(aq [002] {Producer} \(aqclang version 14.0.0\(aq [002] {Variable} extern \(aqS\(aq \-> \(aqStruct\(aq [002] 1 {Struct} \(aqStruct\(aq [003] {Member} public \(aqU\(aq \-> \(aqUnion\(aq [003] 2 {Union} \(aqUnion\(aq [004] 3 {Enumeration} \(aqNestedEnum\(aq \-> \(aqint\(aq [005] {Enumerator} \(aqBLUE\(aq = \(aq0x1\(aq [005] {Enumerator} \(aqRED\(aq = \(aq0x0\(aq .EE .UNINDENT .UNINDENT .SS CodeView \- MSVC (Windows) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-46466\-codeview\-msvc.o\(aq \-> COFF\-i386 [001] {CompileUnit} \(aqpr\-46466.cpp\(aq [002] {Producer} \(aqMicrosoft (R) Optimizing Compiler\(aq [002] {Variable} extern \(aqS\(aq \-> \(aqStruct\(aq [002] 1 {Struct} \(aqStruct\(aq [003] {Member} public \(aqU\(aq \-> \(aqUnion\(aq [003] 2 {Union} \(aqUnion\(aq [004] 3 {Enumeration} \(aqNestedEnum\(aq \-> \(aqint\(aq [005] {Enumerator} \(aqBLUE\(aq = \(aq0x1\(aq [005] {Enumerator} \(aqRED\(aq = \(aq0x0\(aq .EE .UNINDENT .UNINDENT.SS DWARF \- Clang (Linux) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-46466\-dwarf\-clang.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqpr\-46466.cpp\(aq [002] {Producer} \(aqclang version 14.0.0\(aq [002] 8 {Variable} extern \(aqS\(aq \-> \(aqStruct\(aq [002] 1 {Struct} \(aqStruct\(aq [003] 5 {Member} public \(aqU\(aq \-> \(aqUnion\(aq .EE .UNINDENT .UNINDENT .SS DWARF \- GCC (Linux) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-46466\-dwarf\-gcc.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqpr\-46466.cpp\(aq [002] {Producer} \(aqGNU C++14 9.3.0\(aq [002] 8 {Variable} extern \(aqS\(aq \-> \(aqStruct\(aq [002] 1 {Struct} \(aqStruct\(aq [003] 5 {Member} public \(aqU\(aq \-> \(aqUnion\(aq [003] 2 {Union} \(aqUnion\(aq [004] 3 {Enumeration} \(aqNestedEnum\(aq \-> \(aqunsigned int\(aq [005] {Enumerator} \(aqBLUE\(aq = \(aq0x1\(aq [005] {Enumerator} \(aqRED\(aq = \(aq0x0\(aq .EE .UNINDENT .UNINDENT .sp از نماهای منطقی پیشین، می‌توان دریافت که اطلاعات اشکال‌زدایی DWARF تولیدشده توسط کامپایلر Clang شامل هیچ ارجاعی به شمارنده‌های \fBRED\fP و \fBBLUE\fP نیست\&. در حالی که DWARF تولیدشده توسط GCC، و CodeView تولیدشده توسط Clang و MSVC، حاوی چنین ارجاعاتی هستند. .sp با استفاده از امکانات گزینش \fBllvm\-debuginfo\-analyzer\fP، می‌توانیم یک نمای منطقی تولید کنیم که تنها نوع‌های منطقیِ \fBEnumerator\fP و والدین آن‌ها را نشان دهد. این نمای منطقی بر اساس نام نوع‌ها مرتب شده است. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=format,level \-\-output\-sort=name \-\-select\-types=Enumerator \-\-report=parents \-\-print=types pr\-46466\-*.o .EE .UNINDENT .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-46466\-codeview\-clang.o\(aq \-> COFF\-x86\-64 [001] {CompileUnit} \(aqpr\-46466.cpp\(aq [002] 1 {Struct} \(aqStruct\(aq [003] 2 {Union} \(aqUnion\(aq [004] 3 {Enumeration} \(aqNestedEnum\(aq \-> \(aqint\(aq [005] {Enumerator} \(aqBLUE\(aq = \(aq0x1\(aq [005] {Enumerator} \(aqRED\(aq = \(aq0x0\(aq Logical View: [000] {File} \(aqpr\-46466\-codeview\-msvc.o\(aq \-> COFF\-i386 [001] {CompileUnit} \(aqpr\-46466.cpp\(aq [002] 1 {Struct} \(aqStruct\(aq [003] 2 {Union} \(aqUnion\(aq [004] 3 {Enumeration} \(aqNestedEnum\(aq \-> \(aqint\(aq [005] {Enumerator} \(aqBLUE\(aq = \(aq0x1\(aq [005] {Enumerator} \(aqRED\(aq = \(aq0x0\(aq Logical View: [000] {File} \(aqpr\-46466\-dwarf\-clang.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqpr\-46466.cpp\(aq Logical View: [000] {File} \(aqpr\-46466\-dwarf\-gcc.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqpr\-46466.cpp\(aq [002] 1 {Struct} \(aqStruct\(aq [003] 2 {Union} \(aqUnion\(aq [004] 3 {Enumeration} \(aqNestedEnum\(aq \-> \(aqunsigned int\(aq [005] {Enumerator} \(aqBLUE\(aq = \(aq0x1\(aq [005] {Enumerator} \(aqRED\(aq = \(aq0x0\(aq .EE .UNINDENT .UNINDENT .sp با استفاده از امکانات گزینش \fBllvm\-debuginfo\-analyzer\fP، می‌توانیم یک خروجی جدولی ساده شامل خلاصه‌ای از نوع‌های منطقی که \fBEnumerator\fP هستند تولید کنیم\&. این نمای منطقی بر اساس نام نوع‌ها مرتب شده است. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=format,level \-\-output\-sort=name \-\-select\-types=Enumerator \-\-print=types,summary pr\-46466\-*.o .EE .UNINDENT .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-46466\-codeview\-clang.o\(aq \-> COFF\-x86\-64 [001] {CompileUnit} \(aqpr\-46466.cpp\(aq [005] {Enumerator} \(aqBLUE\(aq = \(aq0x1\(aq [005] {Enumerator} \(aqRED\(aq = \(aq0x0\(aq \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Element Total Found \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Scopes 5 0 Symbols 2 0 Types 6 2 Lines 0 0 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Total 13 2 Logical View: [000] {File} \(aqpr\-46466\-codeview\-msvc.o\(aq \-> COFF\-i386 [001] {CompileUnit} \(aqpr\-46466.cpp\(aq [005] {Enumerator} \(aqBLUE\(aq = \(aq0x1\(aq [005] {Enumerator} \(aqRED\(aq = \(aq0x0\(aq \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Element Total Found \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Scopes 5 0 Symbols 2 0 Types 7 2 Lines 0 0 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Total 14 2 Logical View: [000] {File} \(aqpr\-46466\-dwarf\-clang.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqpr\-46466.cpp\(aq \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Element Total Found \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Scopes 4 0 Symbols 0 0 Types 0 0 Lines 0 0 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Total 4 0 Logical View: [000] {File} \(aqpr\-46466\-dwarf\-gcc.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqpr\-46466.cpp\(aq [005] {Enumerator} \(aqBLUE\(aq = \(aq0x1\(aq [005] {Enumerator} \(aqRED\(aq = \(aq0x0\(aq \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Element Total Found \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Scopes 5 0 Symbols 0 0 Types 2 2 Lines 0 0 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Total 7 2 .EE .UNINDENT .UNINDENT.sp از مقادیر چاپ‌شده در ستون \fBFound\fP، می‌توان دید که هیچ \fBTypes\fP در اطلاعات اشکال‌زدایی DWARF تولیدشده توسط Clang یافت نشد. .SS "مورد آزمون ۵ \- حوزه لغوی نادرست برای متغیر (TEST CASE 5 \- INCORRECT LEXICAL SCOPE FOR VARIABLE)" .sp مثال زیر برای نشان دادن خروجی‌های متفاوتی که توسط \fBllvm\-debuginfo\-analyzer\fP\& تولید می‌شود به کار می‌رود. ما مثال را برای هدف‌های X86 Codeview و ELF با نسخه‌های اخیر Clang، GCC و MSVC کامپایل کردیم (\-O0 \-g). .INDENT 0.0 .INDENT 3.5 .sp .EX // definitions.h #ifdef _MSC_VER #define forceinline __forceinline #elif defined(__clang__) #if __has_attribute(__always_inline__) #define forceinline inline __attribute__((__always_inline__)) #else #define forceinline inline #endif #elif defined(__GNUC__) #define forceinline inline __attribute__((__always_inline__)) #else #define forceinline inline #error #endif .EE .UNINDENT .UNINDENT .sp از آنجا که آزمون به گزینه‌های inline کامپایلر وابسته است، فایل سربرگ فوق \fIforceinline\fP\& را تعریف می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .EX #include \(dqdefinitions.h\(dq .EE .UNINDENT .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .EX 1 #include \(dqdefinitions.h\(dq 2 forceinline int InlineFunction(int Param) { 3 int Var_1 = Param; 4 { 5 int Var_2 = Param + Var_1; 6 Var_1 = Var_2; 7 } 8 return Var_1; 9 } 10 11 int test(int Param_1, int Param_2) { 12 int A = Param_1; 13 A += InlineFunction(Param_2); 14 return A; 15 } .EE .UNINDENT .UNINDENT .sp آزمون بالا برای تشریح مشکل متغیری که در کامپایلر Clang یافت شده استفاده می‌شود: PR43860 (Bugs LLVM) \% / PR43205 (GitHub) \% .sp این‌ها نماهای منطقی هستند که \fBllvm\-debuginfo\-analyzer\fP برای ۳ کامپایلر مختلف (MSVC، Clang و GCC) تولید می‌کند که قالب‌های گوناگون اطلاعات اشکال‌زدایی (CodeView، DWARF) را در بسترهای مختلف منتشر می‌کنند. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level,format,producer \-\-output\-sort=name \-\-print=symbols pr\-43860\-codeview\-clang.o pr\-43860\-codeview\-msvc.o pr\-43860\-dwarf\-clang.o pr\-43860\-dwarf\-gcc.o .EE .UNINDENT .UNINDENT.SS CODEVIEW \- Clang (ویندوز) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-43860\-codeview\-clang.o\(aq \-> COFF\-x86\-64 [001] {CompileUnit} \(aqpr\-43860.cpp\(aq [002] {Producer} \(aqclang version 14.0.0\(aq [002] 2 {Function} inlined \(aqInlineFunction\(aq \-> \(aqint\(aq [003] {Parameter} \(aq\(aq \-> \(aqint\(aq [002] {Function} extern not_inlined \(aqtest\(aq \-> \(aqint\(aq [003] {Variable} \(aqA\(aq \-> \(aqint\(aq [003] {InlinedFunction} inlined \(aqInlineFunction\(aq \-> \(aqint\(aq [004] {Parameter} \(aqParam\(aq \-> \(aqint\(aq [004] {Variable} \(aqVar_1\(aq \-> \(aqint\(aq [004] {Variable} \(aqVar_2\(aq \-> \(aqint\(aq [003] {Parameter} \(aqParam_1\(aq \-> \(aqint\(aq [003] {Parameter} \(aqParam_2\(aq \-> \(aqint\(aq .EE .UNINDENT .UNINDENT .SS CODEVIEW \- MSVC (ویندوز) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-43860\-codeview\-msvc.o\(aq \-> COFF\-i386 [001] {CompileUnit} \(aqpr\-43860.cpp\(aq [002] {Producer} \(aqMicrosoft (R) Optimizing Compiler\(aq [002] {Function} extern not_inlined \(aqInlineFunction\(aq \-> \(aqint\(aq [003] {Block} [004] {Variable} \(aqVar_2\(aq \-> \(aqint\(aq [003] {Variable} \(aqParam\(aq \-> \(aqint\(aq [003] {Variable} \(aqVar_1\(aq \-> \(aqint\(aq [002] {Function} extern not_inlined \(aqtest\(aq \-> \(aqint\(aq [003] {Variable} \(aqA\(aq \-> \(aqint\(aq [003] {Variable} \(aqParam_1\(aq \-> \(aqint\(aq [003] {Variable} \(aqParam_2\(aq \-> \(aqint\(aq .EE .UNINDENT .UNINDENT .SS DWARF \- Clang (لینوکس) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-43860\-dwarf\-clang.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqpr\-43860.cpp\(aq [002] {Producer} \(aqclang version 14.0.0\(aq [002] 2 {Function} extern inlined \(aqInlineFunction\(aq \-> \(aqint\(aq [003] {Block} [004] 5 {Variable} \(aqVar_2\(aq \-> \(aqint\(aq [003] 2 {Parameter} \(aqParam\(aq \-> \(aqint\(aq [003] 3 {Variable} \(aqVar_1\(aq \-> \(aqint\(aq [002] 11 {Function} extern not_inlined \(aqtest\(aq \-> \(aqint\(aq [003] 12 {Variable} \(aqA\(aq \-> \(aqint\(aq [003] 13 {InlinedFunction} inlined \(aqInlineFunction\(aq \-> \(aqint\(aq [004] {Block} [005] {Variable} \(aqVar_2\(aq \-> \(aqint\(aq [004] {Parameter} \(aqParam\(aq \-> \(aqint\(aq [004] {Variable} \(aqVar_1\(aq \-> \(aqint\(aq [003] 11 {Parameter} \(aqParam_1\(aq \-> \(aqint\(aq [003] 11 {Parameter} \(aqParam_2\(aq \-> \(aqint\(aq .EE .UNINDENT .UNINDENT .SS DWARF \- GCC (لینوکس) .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-43860\-dwarf\-gcc.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqpr\-43860.cpp\(aq [002] {Producer} \(aqGNU C++14 9.3.0\(aq [002] 2 {Function} extern declared_inlined \(aqInlineFunction\(aq \-> \(aqint\(aq [003] {Block} [004] 5 {Variable} \(aqVar_2\(aq \-> \(aqint\(aq [003] 2 {Parameter} \(aqParam\(aq \-> \(aqint\(aq [003] 3 {Variable} \(aqVar_1\(aq \-> \(aqint\(aq [002] 11 {Function} extern not_inlined \(aqtest\(aq \-> \(aqint\(aq [003] 12 {Variable} \(aqA\(aq \-> \(aqint\(aq [003] 13 {InlinedFunction} declared_inlined \(aqInlineFunction\(aq \-> \(aqint\(aq [004] {Block} [005] {Variable} \(aqVar_2\(aq \-> \(aqint\(aq [004] {Parameter} \(aqParam\(aq \-> \(aqint\(aq [004] {Variable} \(aqVar_1\(aq \-> \(aqint\(aq [003] 11 {Parameter} \(aqParam_1\(aq \-> \(aqint\(aq [003] 11 {Parameter} \(aqParam_2\(aq \-> \(aqint\(aq .EE .UNINDENT .UNINDENT .sp از نماهای منطقی پیشین، می‌توان مشاهده کرد که اطلاعات اشکال‌زدایی CodeView تولیدشده توسط کامپایلر Clang نشان می‌دهد متغیرهای \fBVar_1\fP و \fBVar_2\fP در تابع \fBInlineFuction\fP\& در یک حوزهٔ واژگانی یکسان (\fB4\fP) قرار دارند. DWARF تولیدشده توسط GCC/Clang و CodeView تولیدشده توسط MSVC، این متغیرها را در حوزهٔ واژگانی درست نشان می‌دهند: به‌ترتیب \fB3\fP و \fB4\fP. .sp با استفاده از امکانات گزینش \fBllvm\-debuginfo\-analyzer\fP، می‌توانیم یک خروجی جدولی ساده تولید کنیم که تنها عناصر منطقی دارای الگوی \fIvar\fP در نامشان را نشان می‌دهد. نمای منطقی بر اساس نام متغیرها مرتب شده است. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level,format \-\-output\-sort=name \-\-select\-regex \-\-select\-nocase \-\-select=Var \-\-report=list \-\-print=symbols pr\-43860\-*.o .EE .UNINDENT .UNINDENT .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqpr\-43860\-codeview\-clang.o\(aq \-> COFF\-x86\-64 [001] {CompileUnit} \(aqpr\-43860.cpp\(aq [004] {Variable} \(aqVar_1\(aq \-> \(aqint\(aq [004] {Variable} \(aqVar_2\(aq \-> \(aqint\(aq Logical View: [000] {File} \(aqpr\-43860\-codeview\-msvc.o\(aq \-> COFF\-i386 [001] {CompileUnit} \(aqpr\-43860.cpp\(aq [003] {Variable} \(aqVar_1\(aq \-> \(aqint\(aq [004] {Variable} \(aqVar_2\(aq \-> \(aqint\(aq Logical View: [000] {File} \(aqpr\-43860\-dwarf\-clang.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqpr\-43860.cpp\(aq [004] {Variable} \(aqVar_1\(aq \-> \(aqint\(aq [003] 3 {Variable} \(aqVar_1\(aq \-> \(aqint\(aq [005] {Variable} \(aqVar_2\(aq \-> \(aqint\(aq [004] 5 {Variable} \(aqVar_2\(aq \-> \(aqint\(aq Logical View: [000] {File} \(aqpr\-43860\-dwarf\-gcc.o\(aq \-> elf64\-x86\-64 [001] {CompileUnit} \(aqpr\-43860.cpp\(aq [004] {Variable} \(aqVar_1\(aq \-> \(aqint\(aq [003] 3 {Variable} \(aqVar_1\(aq \-> \(aqint\(aq [005] {Variable} \(aqVar_2\(aq \-> \(aqint\(aq [004] 5 {Variable} \(aqVar_2\(aq \-> \(aqint\(aq .EE .UNINDENT .UNINDENT .sp همچنین نشان می‌دهد که اطلاعات اشکال‌زدایی CodeView شماره خطوط کد منبع را برای آن نمادهای منطقی تولید نمی‌کند. نمای منطقی بر اساس نام نوع‌ها مرتب شده است..SS "مورد آزمایشی ۶ \- نمای منطقی کامل (TEST CASE 6 \- FULL LOGICAL VIEW)" .sp برای کاربران پیشرفته، \fBllvm\-debuginfo\-analyzer\fP می‌تواند اطلاعات سطح پایینی را نمایش دهد که شامل آفست‌ها درون بخش اطلاعات اشکال‌زدایی، عملوندهای مکان اشکال‌زدایی، نام‌های پیوند و غیره است. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=all \-\-print=all test\-dwarf\-clang.o Logical View: [0x0000000000][000] {File} \(aqtest\-dwarf\-clang.o\(aq \-> elf64\-x86\-64 [0x000000000b][001] {CompileUnit} \(aqtest.cpp\(aq [0x000000000b][002] {Producer} \(aqclang version 12.0.0\(aq {Directory} \(aq\(aq {File} \(aqtest.cpp\(aq {Public} \(aqfoo\(aq [0x0000000000:0x000000003a] [0x000000000b][002] {Range} Lines 2:9 [0x0000000000:0x000000003a] [0x00000000bc][002] {BaseType} \(aqbool\(aq [0x0000000099][002] {BaseType} \(aqint\(aq [0x00000000b5][002] {BaseType} \(aqunsigned int\(aq [0x00000000a0][002] {Source} \(aq/test.cpp\(aq [0x00000000a0][002] 1 {TypeAlias} \(aqINTPTR\(aq \-> [0x00000000ab]\(aq* const int\(aq [0x000000002a][002] 2 {Function} extern not_inlined \(aqfoo\(aq \-> [0x0000000099]\(aqint\(aq [0x000000002a][003] {Range} Lines 2:9 [0x0000000000:0x000000003a] [0x000000002a][003] {Linkage} 0x2 \(aq_Z3fooPKijb\(aq [0x0000000071][003] {Block} [0x0000000071][004] {Range} Lines 5:8 [0x000000001c:0x000000002f] [0x000000007e][004] 5 {Variable} \(aqCONSTANT\(aq \-> [0x00000000c3]\(aqconst INTEGER\(aq [0x000000007e][005] {Coverage} 100.00% [0x000000007f][005] {Location} [0x000000007f][006] {Entry} Stack Offset: \-28 (0xffffffffffffffe4) [DW_OP_fbreg] [0x000000001c][004] 5 {Line} {NewStatement} \(aq/test.cpp\(aq [0x000000001c][004] {Code} \(aqmovl $0x7, \-0x1c(%rbp)\(aq [0x0000000023][004] 6 {Line} {NewStatement} \(aq/test.cpp\(aq [0x0000000023][004] {Code} \(aqmovl $0x7, \-0x4(%rbp)\(aq [0x000000002a][004] {Code} \(aqjmp 0x6\(aq [0x000000002f][004] 8 {Line} {NewStatement} \(aq/test.cpp\(aq [0x000000002f][004] {Code} \(aqmovl \-0x14(%rbp), %eax\(aq [0x0000000063][003] 2 {Parameter} \(aqParamBool\(aq \-> [0x00000000bc]\(aqbool\(aq [0x0000000063][004] {Coverage} 100.00% [0x0000000064][004] {Location} [0x0000000064][005] {Entry} Stack Offset: \-21 (0xffffffffffffffeb) [DW_OP_fbreg] [0x0000000047][003] 2 {Parameter} \(aqParamPtr\(aq \-> [0x00000000a0]\(aqINTPTR\(aq [0x0000000047][004] {Coverage} 100.00% [0x0000000048][004] {Location} [0x0000000048][005] {Entry} Stack Offset: \-16 (0xfffffffffffffff0) [DW_OP_fbreg] [0x0000000055][003] 2 {Parameter} \(aqParamUnsigned\(aq \-> [0x00000000b5]\(aqunsigned int\(aq [0x0000000055][004] {Coverage} 100.00% [0x0000000056][004] {Location} [0x0000000056][005] {Entry} Stack Offset: \-20 (0xffffffffffffffec) [DW_OP_fbreg] [0x000000008d][003] 4 {TypeAlias} \(aqINTEGER\(aq \-> [0x0000000099]\(aqint\(aq [0x0000000000][003] 2 {Line} {NewStatement} \(aq/test.cpp\(aq [0x0000000000][003] {Code} \(aqpushq %rbp\(aq [0x0000000001][003] {Code} \(aqmovq %rsp, %rbp\(aq [0x0000000004][003] {Code} \(aqmovb %dl, %al\(aq [0x0000000006][003] {Code} \(aqmovq %rdi, \-0x10(%rbp)\(aq [0x000000000a][003] {Code} \(aqmovl %esi, \-0x14(%rbp)\(aq [0x000000000d][003] {Code} \(aqandb $0x1, %al\(aq [0x000000000f][003] {Code} \(aqmovb %al, \-0x15(%rbp)\(aq [0x0000000012][003] 3 {Line} {NewStatement} {PrologueEnd} \(aq/test.cpp\(aq [0x0000000012][003] {Code} \(aqtestb $0x1, \-0x15(%rbp)\(aq [0x0000000016][003] {Code} \(aqje 0x13\(aq [0x0000000032][003] 8 {Line} \(aq/test.cpp\(aq [0x0000000032][003] {Code} \(aqmovl %eax, \-0x4(%rbp)\(aq [0x0000000035][003] 9 {Line} {NewStatement} \(aq/test.cpp\(aq [0x0000000035][003] {Code} \(aqmovl \-0x4(%rbp), %eax\(aq [0x0000000038][003] {Code} \(aqpopq %rbp\(aq [0x0000000039][003] {Code} \(aqretq\(aq [0x000000003a][003] 9 {Line} {NewStatement} {EndSequence} \(aq/test.cpp\(aq \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Element Total Printed \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Scopes 3 3 Symbols 4 4 Types 5 5 Lines 25 25 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Total 37 37 Scope Sizes: 189 (100.00%) : [0x000000000b][001] {CompileUnit} \(aqtest.cpp\(aq 110 ( 58.20%) : [0x000000002a][002] 2 {Function} extern not_inlined \(aqfoo\(aq \-> [0x0000000099]\(aqint\(aq 27 ( 14.29%) : [0x0000000071][003] {Block} Totals by lexical level: [001]: 189 (100.00%) [002]: 110 ( 58.20%) [003]: 27 ( 14.29%) .EE .UNINDENT .UNINDENT .sp جدول \fBScope Sizes\fP سهم هر حوزه را بر حسب بایت در اطلاعات اشکال‌زدایی نشان می‌دهد، که می‌توان از آن برای تشخیص تغییرات اندازهٔ غیرمنتظره در بخش‌های DWARF بین نسخه‌های مختلف یک زنجیره ابزار استفاده کرد. .INDENT 0.0 .INDENT 3.5 .sp .EX [0x000000002a][002] 2 {Function} extern not_inlined \(aqfoo\(aq \-> [0x0000000099]\(aqint\(aq [0x000000002a][003] {Range} Lines 2:9 [0x0000000000:0x000000003a] [0x000000002a][003] {Linkage} 0x2 \(aq_Z3fooPKijb\(aq [0x0000000071][003] {Block} [0x0000000071][004] {Range} Lines 5:8 [0x000000001c:0x000000002f] [0x000000007e][004] 5 {Variable} \(aqCONSTANT\(aq \-> [0x00000000c3]\(aqconst INTEGER\(aq [0x000000007e][005] {Coverage} 100.00% [0x000000007f][005] {Location} [0x000000007f][006] {Entry} Stack Offset: \-28 (0xffffffffffffffe4) [DW_OP_fbreg] .EE .UNINDENT .UNINDENT .sp صفت \fB{Range}\fP محدوده‌های خط را برای یک حوزهٔ منطقی توصیف می‌کند. در این مورد، تابع \fBfoo\fP بین خطوط \fB2\fP و \fB9\fP قرار دارد\&. .sp صفت‌های \fB{Coverage}\fP و \fB{Location}\fP مکان و پوشش اشکال‌زدایی را برای نمادهای منطقی توصیف می‌کنند. برای کدهای بهینه‌سازی‌شده، مقدار پوشش کاهش می‌یابد و این امر بر قابلیت اشکال‌زدایی برنامه اثر می‌گذارد..SS "پشتیبانی از وب‌اسمبلی (WEBASSEMBLY SUPPORT)" .sp مثال زیر برای نشان دادن خروجی WebAssembly تولیدشده توسط \fBllvm\-debuginfo\-analyzer\fP\& به کار می‌رود. ما این مثال را برای یک مقصد ۳۲\-بیتی WebAssembly با Clang (\-O0 \-g \-\-target=wasm32) کامپایل کردیم: .INDENT 0.0 .INDENT 3.5 .sp .EX 1 using INTPTR = const int *; 2 int foo(INTPTR ParamPtr, unsigned ParamUnsigned, bool ParamBool) { 3 if (ParamBool) { 4 typedef int INTEGER; 5 const INTEGER CONSTANT = 7; 6 return CONSTANT; 7 } 8 return ParamUnsigned; 9 } .EE .UNINDENT .UNINDENT .SS "چاپ جزئیات پایه (PRINT BASIC DETAILS)" .sp دستور زیر جزئیات پایه را برای تمام عنصرهای منطقی مرتب‌شده بر اساس آفست درونی اطلاعات اشکال‌زدایی چاپ می‌کند؛ این شامل سطح لغوی و قالب اطلاعات اشکال‌زدایی آن است. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level,format \-\-output\-sort=offset \-\-print=scopes,symbols,types,lines,instructions test\-clang.o .EE .UNINDENT .UNINDENT .sp یا .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level,format \-\-output\-sort=offset \-\-print=elements test\-clang.o .EE .UNINDENT .UNINDENT .sp هر سطر نشان‌دهنده عنصری است که درون اطلاعات اشکال‌زدایی وجود دارد. ستون نخست بیانگر سطح حوزه، سپس شماره خط مربوطه (در صورت وجود) و در نهایت شرح آن عنصر است. .INDENT 0.0 .INDENT 3.5 .sp .EX Logical View: [000] {File} \(aqtest\-clang.o\(aq \-> WASM [001] {CompileUnit} \(aqtest.cpp\(aq [002] 2 {Function} extern not_inlined \(aqfoo\(aq \-> \(aqint\(aq [003] 2 {Parameter} \(aqParamPtr\(aq \-> \(aqINTPTR\(aq [003] 2 {Parameter} \(aqParamUnsigned\(aq \-> \(aqunsigned int\(aq [003] 2 {Parameter} \(aqParamBool\(aq \-> \(aqbool\(aq [003] {Block} [004] 5 {Variable} \(aqCONSTANT\(aq \-> \(aqconst INTEGER\(aq [004] 5 {Line} [004] {Code} \(aqi32.const 7\(aq [004] {Code} \(aqlocal.set 10\(aq [004] {Code} \(aqlocal.get 5\(aq [004] {Code} \(aqlocal.get 10\(aq [004] {Code} \(aqi32.store 12\(aq [004] 6 {Line} [004] {Code} \(aqi32.const 7\(aq [004] {Code} \(aqlocal.set 11\(aq [004] {Code} \(aqlocal.get 5\(aq [004] {Code} \(aqlocal.get 11\(aq [004] {Code} \(aqi32.store 28\(aq [004] {Code} \(aqbr 1\(aq [004] \- {Line} [004] {Code} \(aqend\(aq [003] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq [003] 2 {Line} [003] {Code} \(aqnop\(aq [003] {Code} \(aqend\(aq [003] {Code} \(aqi64.div_s\(aq [003] {Code} \(aqglobal.get 0\(aq [003] {Code} \(aqlocal.set 3\(aq [003] {Code} \(aqi32.const 32\(aq [003] {Code} \(aqlocal.set 4\(aq [003] {Code} \(aqlocal.get 3\(aq [003] {Code} \(aqlocal.get 4\(aq [003] {Code} \(aqi32.sub\(aq [003] {Code} \(aqlocal.set 5\(aq [003] {Code} \(aqlocal.get 5\(aq [003] {Code} \(aqlocal.get 0\(aq [003] {Code} \(aqi32.store 24\(aq [003] {Code} \(aqlocal.get 5\(aq [003] {Code} \(aqlocal.get 1\(aq [003] {Code} \(aqi32.store 20\(aq [003] {Code} \(aqlocal.get 2\(aq [003] {Code} \(aqlocal.set 6\(aq [003] {Code} \(aqlocal.get 5\(aq [003] {Code} \(aqlocal.get 6\(aq [003] {Code} \(aqi32.store8 19\(aq [003] 3 {Line} [003] {Code} \(aqlocal.get 5\(aq [003] {Code} \(aqi32.load8_u 19\(aq [003] {Code} \(aqlocal.set 7\(aq [003] 3 {Line} [003] {Code} \(aqi32.const 1\(aq [003] {Code} \(aqlocal.set 8\(aq [003] {Code} \(aqlocal.get 7\(aq [003] {Code} \(aqlocal.get 8\(aq [003] {Code} \(aqi32.and\(aq [003] {Code} \(aqlocal.set 9\(aq [003] {Code} \(aqblock\(aq [003] {Code} \(aqblock\(aq [003] {Code} \(aqlocal.get 9\(aq [003] {Code} \(aqi32.eqz\(aq [003] {Code} \(aqbr_if 0\(aq [003] 8 {Line} [003] {Code} \(aqlocal.get 5\(aq [003] {Code} \(aqi32.load 20\(aq [003] {Code} \(aqlocal.set 12\(aq [003] 8 {Line} [003] {Code} \(aqlocal.get 5\(aq [003] {Code} \(aqlocal.get 12\(aq [003] {Code} \(aqi32.store 28\(aq [003] \- {Line} [003] {Code} \(aqend\(aq [003] 9 {Line} [003] {Code} \(aqlocal.get 5\(aq [003] {Code} \(aqi32.load 28\(aq [003] {Code} \(aqlocal.set 13\(aq [003] {Code} \(aqlocal.get 13\(aq [003] {Code} \(aqreturn\(aq [003] {Code} \(aqend\(aq [003] 9 {Line} [003] {Code} \(aqunreachable\(aq [002] 1 {TypeAlias} \(aqINTPTR\(aq \-> \(aq* const int\(aq .EE .UNINDENT .UNINDENT.SS "انتخاب عناصر منطقی (SELECT LOGICAL ELEMENTS)" .sp دستور زیر تمام \fIinstructions\fP، \fIsymbols\fP و \fItypes\fP را که در نام یا نوع خود حاوی \fB\(aqblock\(aq\fP یا \fB\(aq.store\(aq\fP هستند، با استفاده از یک چیدمان تب‌بندی‌شده و با ارائه تعداد موارد منطبق چاپ می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level \-\-select\-nocase \-\-select\-regex \-\-select=BLOCK \-\-select=.store \-\-report=list \-\-print=symbols,types,instructions,summary test\-clang.o Logical View: [000] {File} \(aqtest\-clang.o\(aq [001] {CompileUnit} \(aqtest.cpp\(aq [003] {Code} \(aqblock\(aq [003] {Code} \(aqblock\(aq [004] {Code} \(aqi32.store 12\(aq [003] {Code} \(aqi32.store 20\(aq [003] {Code} \(aqi32.store 24\(aq [004] {Code} \(aqi32.store 28\(aq [003] {Code} \(aqi32.store 28\(aq [003] {Code} \(aqi32.store8 19\(aq \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Element Total Printed \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Scopes 3 0 Symbols 4 0 Types 2 0 Lines 62 8 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Total 71 8 .EE .UNINDENT .UNINDENT .SS "حالت مقایسه (COMPARISON MODE)" .sp با توجه به مثال قبلی، با مقایسه در برابر یک کامپایلر دیگر، اشکال فوق در اطلاعات اشکال‌زدایی (مربوط به مکان نامعتبر پیشین حوزه برای \fB\(aqtypedef int INTEGER\(aq\fP) را پیدا کردیم. .sp با استفاده از GCC برای تولید test\-dwarf\-gcc.o، می‌توانیم یک الگوی انتخاب را به همراه حالت چاپ اعمال کنیم تا خروجی نمای منطقی زیر به دست آید. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level \-\-select\-regex \-\-select\-nocase \-\-select=INTe \-\-report=list \-\-print=symbols,types test\-clang.o test\-dwarf\-gcc.o Logical View: [000] {File} \(aqtest\-clang.o\(aq [001] {CompileUnit} \(aqtest.cpp\(aq [003] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq [004] 5 {Variable} \(aqCONSTANT\(aq \-> \(aqconst INTEGER\(aq Logical View: [000] {File} \(aqtest\-dwarf\-gcc.o\(aq [001] {CompileUnit} \(aqtest.cpp\(aq [004] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq [004] 5 {Variable} \(aqCONSTANT\(aq \-> \(aqconst INTEGER\(aq .EE .UNINDENT .UNINDENT .sp خروجی نشان می‌دهد که هر دو شیء حاوی عناصر یکسانی هستند؛ اما \fB\(aqtypedef INTEGER\(aq\fP در سطح حوزه (scope level) متفاوتی قرار گرفته است. شیء تولیدشده توسط GCC مقدار \fB\(aq4\(aq\fP را نشان می‌دهد که مقدار صحیح است. .sp دو روش مقایسه وجود دارد: نمای منطقی و عناصر منطقی..SS "نمای منطقی (LOGICAL VIEW)" .sp این بخش، نمای منطقی را به‌عنوان یک واحد کامل مقایسه می‌کند؛ برای برقراری تطابق، هر عنصر منطقی مقایسه‌شده باید والدین و فرزندان یکسانی داشته باشد. .sp خروجی، عناصر \fBازدست‌رفته (\-)\fP و \fBاضافه‌شده (+)\fP را در قالب نما نشان می‌دهد و با جابه‌جا کردن فایل‌های شیء مرجع و هدف، زمینه و اطلاعات بیشتری ارائه می‌دهد. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level \-\-compare=types \-\-report=view \-\-print=symbols,types test\-clang.o test\-dwarf\-gcc.o Reference: \(aqtest\-clang.o\(aq Target: \(aqtest\-dwarf\-gcc.o\(aq Logical View: [000] {File} \(aqtest\-clang.o\(aq [001] {CompileUnit} \(aqtest.cpp\(aq [002] 1 {TypeAlias} \(aqINTPTR\(aq \-> \(aq* const int\(aq [002] 2 {Function} extern not_inlined \(aqfoo\(aq \-> \(aqint\(aq [003] {Block} [004] 5 {Variable} \(aqCONSTANT\(aq \-> \(aqconst INTEGER\(aq +[004] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq [003] 2 {Parameter} \(aqParamBool\(aq \-> \(aqbool\(aq [003] 2 {Parameter} \(aqParamPtr\(aq \-> \(aqINTPTR\(aq [003] 2 {Parameter} \(aqParamUnsigned\(aq \-> \(aqunsigned int\(aq \-[003] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq .EE .UNINDENT .UNINDENT .sp خروجی، مسیر ادغام نما (مرجع و هدف) را همراه با عناصر ازدست‌رفته و اضافه‌شده نشان می‌دهد. .SS "عناصر منطقی (LOGICAL ELEMENTS)" .sp این حالت، عناصر منطقی منفرد را بدون در نظر گرفتن یکسان بودن والدین آن‌ها مقایسه می‌کند. در هر دو روش مقایسه، معیارهای برابری شامل نام، مکان در کد منبع، نوع و سطح حوزهٔ لغوی (lexical scope level) است. .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level \-\-compare=types \-\-report=list \-\-print=symbols,types,summary test\-clang.o test\-dwarf\-gcc.o Reference: \(aqtest\-clang.o\(aq Target: \(aqtest\-dwarf\-gcc.o\(aq (1) Missing Types: \-[003] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq (1) Added Types: +[004] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Element Expected Missing Added \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Scopes 4 0 0 Symbols 0 0 0 Types 2 1 1 Lines 0 0 0 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Total 6 1 1 .EE .UNINDENT .UNINDENT .sp تغییر ترتیب \fIReference\fP و \fITarget\fP: .INDENT 0.0 .INDENT 3.5 .sp .EX llvm\-debuginfo\-analyzer \-\-attribute=level \-\-compare=types \-\-report=list \-\-print=symbols,types,summary test\-dwarf\-gcc.o test\-clang.o Reference: \(aqtest\-dwarf\-gcc.o\(aq Target: \(aqtest\-clang.o\(aq (1) Missing Types: \-[004] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq (1) Added Types: +[003] 4 {TypeAlias} \(aqINTEGER\(aq \-> \(aqint\(aq \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Element Expected Missing Added \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Scopes 4 0 0 Symbols 0 0 0 Types 2 1 1 Lines 0 0 0 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- Total 6 1 1 .EE .UNINDENT .UNINDENT .sp با توجه به جابه‌جا شدن \fIReference\fP و \fITarget\fP، موارد \fIAdded Types\fP در حالت اول، اکنون به‌عنوان \fIMissing Types\fP فهرست می‌شوند\&..SH "وضعیت خروج (EXIT STATUS)" .sp در صورتی که فایل‌های ورودی با موفقیت تجزیه و چاپ شوند، \fBllvm\-debuginfo\-analyzer\fP مقدار 0 را برمی‌گرداند. در غیر این صورت، مقدار 1 را بازمی‌گرداند. .SH "محدودیت‌ها و مشکلات شناخته‌شده (LIMITATIONS AND KNOWN ISSUES)" .sp به \fBLimitations\fP\& مراجعه کنید. .SH "همچنین ببینید (SEE ALSO)" .sp \fBllvm\-dwarfdump \%\fP .SH "نویسندگان (AUTHORS)" توسط تیم LLVM نگهداری می‌شود (https://llvm.org). .SH "کپی‌رایت و تکثیر (COPYRIGHT)" 2003-2026, LLVM Project .\" End of generated man page.