LLVM-SYMBOLIZER(1) LLVM LLVM-SYMBOLIZER(1)

llvm-symbolizer - تبدیل آدرس‌ها به مکان‌های کد منبع

llvm-symbolizer [گزینه‌ها] [آدرس‌ها...]

دستور llvm-symbolizer نام‌های ورودی و آدرس‌ها را از خط فرمان خوانده و مکان‌های متناظر در کد منبع را در خروجی استاندارد چاپ می‌کند. این ابزار همچنین می‌تواند لاگ‌های حاوی نشانه‌گذاری سمبولایزر (Symbolizer Markup) <> را از طریق --filter-markup نمادگذاری (symbolize) کند. آدرس‌ها می‌توانند به صورت عدد یا نام نماد مشخص شوند.

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

نام‌های ورودی می‌توانند همراه با آدرس‌ها، چه در ورودی استاندارد و چه به عنوان آرگومان‌های مکانی در خط فرمان مشخص شوند. به طور پیش‌فرض، نام‌های ورودی به عنوان مسیرهای فایل شیء (object file) تفسیر می‌شوند. با این حال، قرار دادن پیشوند BUILDID: قبل از یک نام مشخص می‌کند که آن مقدار به جای مسیر، یک شناسه ساخت (build ID) در مبنای ۱۶ (hex) است. این کار باینری اشکال‌زدایی متناظر را جستجو می‌کند. برای حفظ یکدستی، افزودن پیشوند FILE: صریحاً بیان می‌کند که مقدار داده‌شده مسیر فایل شیء است (حالت پیش‌فرض).

یک آرگومان مکانی یا مقدار ورودی استاندارد می‌تواند با "DATA" یا "CODE" آغاز شود تا مشخص کند که آدرس باید به ترتیب به عنوان داده یا کد اجرایی نمادگذاری شود. اگر هیچ‌کدام مشخص نشده باشد، "CODE" فرض می‌شود. مقدار DATA به جای شماره خط، به صورت آدرس و اندازه نماد نمادگذاری می‌شود.

ابزار llvm-symbolizer گزینه‌ها را پس از پردازش از خط فرمان، از متغیر محیطی LLVM_SYMBOLIZER_OPTS نیز پردازش می‌کند. متغیر LLVM_SYMBOLIZER_OPTS در درجه اول برای تکمیل گزینه‌های خط فرمان هنگام فراخوانی llvm-symbolizer توسط برنامه‌ای دیگر یا محیط زمان‌اجرا (runtime) مفید است.

تمام مثال‌های زیر از دو فایل منبع زیر به عنوان ورودی استفاده می‌کنند. آن‌ها از ترکیبی از پیوند (linkage) به سبک C و C++ بهره می‌برند تا نحوه چاپ متفاوت این نام‌ها را نشان دهند (به --demangle مراجعه کنید).

// test.h
extern "C" inline int foz() {
  return 1234;
}
// test.cpp
#include "test.h"
int bar=42;
int foo() {
  return bar;
}
int baz() {
  volatile int k = 42;
  return foz() + k;
}
int main() {
  return foo() + baz();
}

این فایل‌ها به صورت زیر ساخته می‌شوند:

$ clang -g test.cpp -o test.elf
$ clang -g -O2 test.cpp -o inlined.elf

مثال ۱ - آدرس‌ها و فایل شیء در خط فرمان:

$ llvm-symbolizer --obj=test.elf 0x4004d0 0x400490
foz
/tmp/test.h:1:0
baz()
/tmp/test.cpp:11:0

مثال ۲ - آدرس‌ها در ورودی استاندارد:

$ cat addr.txt
0x4004a0
0x400490
0x4004d0
$ llvm-symbolizer --obj=test.elf < addr.txt
main
/tmp/test.cpp:15:0
baz()
/tmp/test.cpp:11:0
foz
/tmp/./test.h:1:0

مثال ۳ - فایل شیء مشخص‌شده همراه با آدرس:

$ llvm-symbolizer "test.elf 0x400490" "FILE:inlined.elf 0x400480"
baz()
/tmp/test.cpp:11:0
foo()
/tmp/test.cpp:8:10
$ cat addr2.txt
FILE:test.elf 0x4004a0
inlined.elf 0x400480
$ llvm-symbolizer < addr2.txt
main
/tmp/test.cpp:15:0
foo()
/tmp/test.cpp:8:10

مثال ۴ - پیشوندهای BUILDID و FILE:

$ llvm-symbolizer "FILE:test.elf 0x400490" "DATA BUILDID:123456789abcdef 0x601028"
baz()
/tmp/test.cpp:11:0
bar
6295592 4
$ cat addr3.txt
FILE:test.elf 0x400490
DATA BUILDID:123456789abcdef 0x601028
$ llvm-symbolizer < addr3.txt
baz()
/tmp/test.cpp:11:0
bar
6295592 4

مثال ۵ - پیشوندهای CODE و DATA:

$ llvm-symbolizer --obj=test.elf "CODE 0x400490" "DATA 0x601028"
baz()
/tmp/test.cpp:11:0
bar
6295592 4
$ cat addr4.txt
CODE test.elf 0x4004a0
DATA inlined.elf 0x601028
$ llvm-symbolizer < addr4.txt
main
/tmp/test.cpp:15:0
bar
6295592 4

مثال ۶ - گزینه‌های سبک مسیر:

این مثال از همان فایل منبع بالا استفاده می‌کند، اما مسیر کامل فایل منبع /tmp/foo/test.cpp است و به صورت زیر کامپایل می‌شود. حالت نخست مسیر مطلق پیش‌فرض را نشان می‌دهد، حالت دوم --basenames و حالت سوم --relativenames را نمایش می‌دهد.

$ pwd
/tmp
$ clang -g foo/test.cpp -o test.elf
$ llvm-symbolizer --obj=test.elf 0x4004a0
main
/tmp/foo/test.cpp:15:0
$ llvm-symbolizer --obj=test.elf 0x4004a0 --basenames
main
test.cpp:15:0
$ llvm-symbolizer --obj=test.elf 0x4004a0 --relativenames
main
foo/test.cpp:15:0

مثال ۷ - آدرس‌ها به‌عنوان نام نمادها:

$ llvm-symbolizer --obj=test.elf main
main
/tmp/test.cpp:14:0
$ llvm-symbolizer --obj=test.elf "CODE foz"
foz
/tmp/test.h:1:0

مثال ۸ - خروجی --skip-line-zero برای آدرسی بدون خط متناظر (آدرسی وابسته به خط صفر):

// test.c
int foo = 0;
int x = 1234;
int main() {
  if (x)
    return foo;
  else
    return x;
}

این فایل‌ها به صورت زیر ساخته می‌شوند:

$ clang -g -O2 -S test.c -o test.s
$ llvm-mc -filetype=obj -triple=x86_64-unknown-linux  test.s -o test.o
$ llvm-symbolizer --obj=test.o --skip-line-zero 0xa
main
/tmp/test.c:5:7 (approximate)
هنگام انجام جستجوها، آفست مشخص‌شده را به آدرس‌های فایل شیء اضافه می‌کند. از این گزینه می‌توان برای انجام جستجوها به گونه‌ای استفاده کرد که گویی شیء به اندازه آفست بازآرایی (relocated) شده است.
اگر آدرسی فاقد شماره خط مرتبط باشد، از آخرین شماره خط توالی جاری در جدول خطوط (line-table) استفاده می‌کند. این خطوط در خروجی با عنوان "approximate" (تقریبی) برچسب‌گذاری می‌شوند زیرا ممکن است گمراه‌کننده باشند.
به جای مسیر مطلق، تنها نام فایل را بدون هیچ دایرکتوری چاپ می‌کند.
شیء را با استفاده از شناسه ساخت (build ID) داده‌شده که به صورت یک رشته هگزادسیمال مشخص شده، جستجو می‌کند. با --obj مانعة‌الجمع است.
تعیین می‌کند که آیا در حالت --filter-markup از رنگ استفاده شود یا خیر. پیش‌فرض auto است که پشتیبانی خروجی استاندارد از رنگ را شناسایی می‌کند. مشخص کردن --color به تنهایی معادل --color=always است.
مسیری به یک دایرکتوری دارای زیردایرکتوری .build-id برای جستجوی اطلاعات اشکال‌زدایی باینری‌های استریپ‌شده (stripped) فراهم می‌کند. در صورت وجود چندین نمونه از این آرگومان، به ترتیب مشخص‌شده جستجو می‌شوند.
تعیین می‌کند که جستجوهای debuginfod برای باینری‌های اشکال‌زدایی انجام شوند یا خیر. در صورت عدم تعیین، debuginfod تنها زمانی فعال است که libcurl در زمان کامپایل فعال شده باشد (LLVM_ENABLE_CURL) و دست‌کم نشانی یک سرور توسط متغیر محیطی DEBUGINFOD_URLS فراهم شده باشد.
در صورت درهم‌ریخته (mangled) بودن نام توابع، نام‌های مرتب‌شده (demangled) را چاپ می‌کند (برای نمونه، نام درهم‌ریخته _Z3bazv به baz() تبدیل می‌شود، در حالی که نام غیردرهم‌ریخته foz همان‌گونه که هست چاپ می‌شود). پیش‌فرض true است.
از فایل DWP مشخص‌شده در <path> برای هر CU که داده‌های اشکال‌زدایی تفکیک‌شده DWARF دارد استفاده می‌کند.
هنگامی که یک فایل مجزا شامل داده‌های اشکال‌زدایی بوده و توسط یک بخش پیوند اشکال‌زدایی گنو (GNU debug link) به آن ارجاع داده شده باشد، در صورتی که نتوان داده‌ها را نسبت به فایل شیء پیدا کرد، از مسیر مشخص‌شده به عنوان مبنایی برای مکان‌یابی داده‌های اشکال‌زدایی استفاده می‌کند.
داده‌ها را از ورودی استاندارد خوانده، نشانه‌گذاری نمادگذار (Symbolizer Markup) درون آن <> را به قالبی خوانا برای انسان تبدیل کرده و نتایج را در خروجی استاندارد چاپ می‌کند. مؤلفه‌های نشانه‌گذاری زیر هنوز پشتیبانی نمی‌شوند:
  • {{{hexdict}}}
  • {{{dumpfile}}}

مؤلفه ردگیری بازگشتی {{{bt}}} فریم‌ها را با نحو زیر گزارش می‌دهد:

#<number>[.<inline>] <address> <function> <file>:<line>:<col> (<module>+<relative address>)

<inline> شماره فریم‌ها را برای فراخوانی‌های درون‌خطی‌شده (inlined) درون فراخواننده متناظر با <number> فراهم می‌کند. شماره فراخوانی‌های درون‌خطی از ۱ آغاز شده و از فراخوانده (callee) به فراخواننده (caller) افزایش می‌یابد.

<address> آدرسی درون دستور فراخوانی تابع است. این آدرس لزوماً نقطه آغاز دستور نیست. <relative address> آفست مجازی متناظر در <module> بارگذاری‌شده در آن آدرس است.

نحوه چاپ نام توابع را تعیین می‌کند (به ترتیب: حذف نام تابع، چاپ نام کوتاه تابع، یا چاپ نام کامل پیوند/linkage). پیش‌فرض linkage است.
راهنما و نحوه استفاده از این دستور را نمایش می‌دهد.
اگر موقعیت کد مبدأ درون یک تابع درون‌خطی (inlined) باشد، تمام فریم‌های درون‌خطی را چاپ می‌کند. این رفتار پیش‌فرض است.
فریم‌های درون‌خطی را چاپ نمی‌کند.
نام‌های مرتب‌شده (demangled) توابع را چاپ نمی‌کند.
مسیر فایل شیء مورد نظر برای نمادگذاری. اگر - مشخص شود، شیء مستقیماً از جریان ورودی استاندارد خوانده می‌شود. با --build-id مانعة‌الجمع است.
سبک خروجی ترجیحی را مشخص می‌کند. پیش‌فرض LLVM است. هنگامی که سبک خروجی روی GNU تنظیم شود، ابزار از سبک addr2line گنو پیروی می‌کند. تفاوت‌ها با سبک LLVM عبارتند از:
  • ستون موقعیت کد مبدأ را چاپ نمی‌کند.
  • پس از گزارش مربوط به یک آدرس، خط خالی اضافه نمی‌کند.
  • هنگامی که فریم‌های درون‌خطی نمایش داده نمی‌شوند، نام تابع درون‌خطی را با نام بالاترین فراخواننده (topmost caller) جایگزین نمی‌کند.
  • تشخیص‌دهنده (discriminator) داده‌های اشکال‌زدایی آدرس را در صورت غیرصفر بودن چاپ می‌کند. یک روش برای تولید این تشخیص‌دهنده‌ها کامپایل با گزینه -fdebug-info-for-profiling در clang است.
سبک JSON خروجی ماشین‌خوانایی به صورت JSON فراهم می‌کند. اگر آدرس‌ها از طریق stdin داده شوند، JSON خروجی مجموعه‌ای از اشیاء جداگانه خواهد بود. در غیر این صورت، تمام نتایج در قالب یک آرایه واحد گنجانده می‌شوند.
$ llvm-symbolizer --obj=inlined.elf 0x4004be 0x400486 -p
baz() at /tmp/test.cpp:11:18
 (inlined by) main at /tmp/test.cpp:15:0
foo() at /tmp/test.cpp:6:3
$ llvm-symbolizer --output-style=LLVM --obj=inlined.elf 0x4004be 0x400486 -p --no-inlines
main at /tmp/test.cpp:11:18
foo() at /tmp/test.cpp:6:3
$ llvm-symbolizer --output-style=GNU --obj=inlined.elf 0x4004be 0x400486 -p --no-inlines
baz() at /tmp/test.cpp:11
foo() at /tmp/test.cpp:6
$ clang -g -fdebug-info-for-profiling test.cpp -o profiling.elf
$ llvm-symbolizer --output-style=GNU --obj=profiling.elf 0x401167 -p --no-inlines
main at /tmp/test.cpp:15 (discriminator 2)
$ llvm-symbolizer --output-style=JSON --obj=inlined.elf 0x4004be 0x400486 -p
[
  {
    "Address": "0x4004be",
    "ModuleName": "inlined.elf",
    "Symbol": [
      {
        "Column": 18,
        "Discriminator": 0,
        "FileName": "/tmp/test.cpp",
        "FunctionName": "baz()",
        "Line": 11,
        "StartAddress": "0x4004be",
        "StartFileName": "/tmp/test.cpp",
        "StartLine": 9
      },
      {
        "Column": 0,
        "Discriminator": 0,
        "FileName": "/tmp/test.cpp",
        "FunctionName": "main",
        "Line": 15,
        "StartAddress": "0x4004be",
        "StartFileName": "/tmp/test.cpp",
        "StartLine": 14
      }
    ]
  },
  {
    "Address": "0x400486",
    "ModuleName": "inlined.elf",
    "Symbol": [
      {
        "Column": 3,
        "Discriminator": 0,
        "FileName": "/tmp/test.cpp",
        "FunctionName": "foo()",
        "Line": 6,
        "StartAddress": "0x400486",
        "StartFileName": "/tmp/test.cpp",
        "StartLine": 5
      }
    ]
  }
]
--pretty-print, -p چاپ خروجی خوانا برای انسان. اگر --inlining مشخص شده باشد، حوزهٔ دربرگیرنده با پیشوند (inlined by) مشخص می‌شود. برای خروجی JSON، این گزینه باعث می‌شود JSON دندانه‌دار شده و در خطوط جدید شکسته شود. در غیر این صورت، خروجی JSON به فرمی فشرده چاپ خواهد شد.
$ llvm-symbolizer --obj=inlined.elf 0x4004be --inlining --pretty-print
baz() at /tmp/test.cpp:11:18
 (inlined by) main at /tmp/test.cpp:15:0
چاپ آدرس پیش از مکان کد منبع. پیش‌فرض false است.
$ llvm-symbolizer --obj=inlined.elf --print-address 0x4004be
0x4004be
baz()
/tmp/test.cpp:11:18
main
/tmp/test.cpp:15:0
$ llvm-symbolizer --obj=inlined.elf 0x4004be --pretty-print --print-address
0x4004be: baz() at /tmp/test.cpp:11:18
 (inlined by) main at /tmp/test.cpp:15:0
چاپ N خط از بافت کد منبع برای هر آدرس نمادگذاری‌شده.
$ llvm-symbolizer --obj=test.elf 0x400490 --print-source-context-lines=3
baz()
/tmp/test.cpp:11:0
10  :   volatile int k = 42;
11 >:   return foz() + k;
12  : }
چاپ مسیر فایل به صورت نسبی نسبت به دایرکتوری کامپایل، به جای مسیر مطلق. اگر خط فرمان کامپایلر شامل مسیر کامل بوده باشد، این گزینه همانند حالت پیش‌فرض عمل خواهد کرد.
چاپ اطلاعات با جزئیات کامل دربارهٔ آدرس، سطر و ستون.
$ llvm-symbolizer --obj=inlined.elf --verbose 0x4004be
baz()
  Filename: /tmp/test.cpp
  Function start filename: /tmp/test.cpp
  Function start line: 9
  Function start address: 0x4004b6
  Line: 11
  Column: 18
main
  Filename: /tmp/test.cpp
  Function start filename: /tmp/test.cpp
  Function start line: 14
  Function start address: 0x4004b0
  Line: 15
  Column: 18
چاپ اطلاعات نسخهٔ ابزار.
@<FILE>
خواندن گزینه‌های خط فرمان از فایل پاسخ <FILE>.
استفاده از Windows DIA SDK برای نمادین‌سازی. در صورتی که DIA SDK پیدا نشود، llvm-symbolizer به پیاده‌سازی بومی بازمی‌گردد.

اگر یک باینری شامل فایل‌های شیء برای چندین معماری باشد (برای مثال یک باینری جامع Mach-O یا یک آرشیو با نسخه‌های مختلف معماری)، فایل شیء مربوط به یک معماری معین را نمادین‌سازی می‌کند. شما همچنین می‌توانید با درج binary_name:arch_name در ورودی، معماری را مشخص کنید (مثال زیر را ببینید). برای آرشیوها، قالب archive.a(member.o):arch نیز پشتیبانی می‌شود. اگر معماری مشخص نشود، آدرس نمادین‌سازی نخواهد شد. پیش‌فرض، یک رشته خالی است.
$ cat addr.txt
/tmp/mach_universal_binary:i386 0x1f84
/tmp/mach_universal_binary:x86_64 0x100000f24
/tmp/archive.a(member.o):ppc 0x1000
/tmp/archive.a(member.o):ppc64 0x2000
$ llvm-symbolizer < addr.txt
_main
/tmp/source_i386.cc:8
_main
/tmp/source_x86_64.cc:8
_foo
/tmp/source_ppc.cc:12
_foo
/tmp/source_ppc64.cc:12
اگر اطلاعات اشکال‌زدایی برای یک باینری در مکان پیش‌فرض موجود نباشد، به دنبال اطلاعات اشکال‌زدایی در مسیر .dSYM مشخص‌شده توسط این گزینه بگردید. از این گزینه می‌توان چندین بار استفاده کرد.

دستور llvm-symbolizer مقدار 0 را برمی‌گرداند. سایر کدهای خروج نشان‌دهنده یک خطای داخلی برنامه هستند.

llvm-addr2line(1) <llvm-addr2line.html>

توسط تیم LLVM نگهداری می‌شود (https://llvm.org).

2003-2026, LLVM Project

2026-07-15 22