xref: /llvm-project/llvm/docs/CommandGuide/llvm-symbolizer.rst (revision 0886440ef0ed0ad553522b731c841b81dc36944c)
1llvm-symbolizer - convert addresses into source code locations
2==============================================================
3
4.. program:: llvm-symbolizer
5
6SYNOPSIS
7--------
8
9:program:`llvm-symbolizer` [*options*] [*addresses...*]
10
11DESCRIPTION
12-----------
13
14:program:`llvm-symbolizer` reads input names and addresses from the command-line
15and prints corresponding source code locations to standard output. It can also
16symbolize logs containing :doc:`Symbolizer Markup </SymbolizerMarkupFormat>` via
17:option:`--filter-markup`. Addresses may be specified as numbers or symbol names.
18
19If no address is specified on the command-line, it reads the addresses from
20standard input. If no input name is specified on the command-line, but addresses
21are, the first address value is treated as an input name. If an input value is not
22recognized, it reports that source information is not found.
23
24Input names can be specified together with the addresses either on standard
25input or as positional arguments on the command-line. By default, input names
26are interpreted as object file paths. However, prefixing a name with
27``BUILDID:`` states that it is a hex build ID rather than a path. This will look
28up the corresponding debug binary. For consistency, prefixing a name with
29``FILE:`` explicitly states that it is an object file path (the default).
30
31A positional argument or standard input value can be preceded by "DATA" or
32"CODE" to indicate that the address should be symbolized as data or executable
33code respectively. If neither is specified, "CODE" is assumed. DATA is
34symbolized as address and symbol size rather than line number.
35
36:program:`llvm-symbolizer` parses options from the environment variable
37``LLVM_SYMBOLIZER_OPTS`` after parsing options from the command line.
38``LLVM_SYMBOLIZER_OPTS`` is primarily useful for supplementing the command-line
39options when :program:`llvm-symbolizer` is invoked by another program or
40runtime.
41
42EXAMPLES
43--------
44
45All of the following examples use the following two source files as input. They
46use a mixture of C-style and C++-style linkage to illustrate how these names are
47printed differently (see :option:`--demangle`).
48
49.. code-block:: c
50
51  // test.h
52  extern "C" inline int foz() {
53    return 1234;
54  }
55
56.. code-block:: c
57
58  // test.cpp
59  #include "test.h"
60  int bar=42;
61
62  int foo() {
63    return bar;
64  }
65
66  int baz() {
67    volatile int k = 42;
68    return foz() + k;
69  }
70
71  int main() {
72    return foo() + baz();
73  }
74
75These files are built as follows:
76
77.. code-block:: console
78
79  $ clang -g test.cpp -o test.elf
80  $ clang -g -O2 test.cpp -o inlined.elf
81
82Example 1 - addresses and object on command-line:
83
84.. code-block:: console
85
86  $ llvm-symbolizer --obj=test.elf 0x4004d0 0x400490
87  foz
88  /tmp/test.h:1:0
89
90  baz()
91  /tmp/test.cpp:11:0
92
93Example 2 - addresses on standard input:
94
95.. code-block:: console
96
97  $ cat addr.txt
98  0x4004a0
99  0x400490
100  0x4004d0
101  $ llvm-symbolizer --obj=test.elf < addr.txt
102  main
103  /tmp/test.cpp:15:0
104
105  baz()
106  /tmp/test.cpp:11:0
107
108  foz
109  /tmp/./test.h:1:0
110
111Example 3 - object specified with address:
112
113.. code-block:: console
114
115  $ llvm-symbolizer "test.elf 0x400490" "FILE:inlined.elf 0x400480"
116  baz()
117  /tmp/test.cpp:11:0
118
119  foo()
120  /tmp/test.cpp:8:10
121
122  $ cat addr2.txt
123  FILE:test.elf 0x4004a0
124  inlined.elf 0x400480
125
126  $ llvm-symbolizer < addr2.txt
127  main
128  /tmp/test.cpp:15:0
129
130  foo()
131  /tmp/test.cpp:8:10
132
133Example 4 - BUILDID and FILE prefixes:
134
135.. code-block:: console
136
137  $ llvm-symbolizer "FILE:test.elf 0x400490" "DATA BUILDID:123456789abcdef 0x601028"
138  baz()
139  /tmp/test.cpp:11:0
140
141  bar
142  6295592 4
143
144  $ cat addr3.txt
145  FILE:test.elf 0x400490
146  DATA BUILDID:123456789abcdef 0x601028
147
148  $ llvm-symbolizer < addr3.txt
149  baz()
150  /tmp/test.cpp:11:0
151
152  bar
153  6295592 4
154
155Example 5 - CODE and DATA prefixes:
156
157.. code-block:: console
158
159  $ llvm-symbolizer --obj=test.elf "CODE 0x400490" "DATA 0x601028"
160  baz()
161  /tmp/test.cpp:11:0
162
163  bar
164  6295592 4
165
166  $ cat addr4.txt
167  CODE test.elf 0x4004a0
168  DATA inlined.elf 0x601028
169
170  $ llvm-symbolizer < addr4.txt
171  main
172  /tmp/test.cpp:15:0
173
174  bar
175  6295592 4
176
177Example 6 - path-style options:
178
179This example uses the same source file as above, but the source file's
180full path is /tmp/foo/test.cpp and is compiled as follows. The first case
181shows the default absolute path, the second --basenames, and the third
182shows --relativenames.
183
184.. code-block:: console
185
186  $ pwd
187  /tmp
188  $ clang -g foo/test.cpp -o test.elf
189  $ llvm-symbolizer --obj=test.elf 0x4004a0
190  main
191  /tmp/foo/test.cpp:15:0
192  $ llvm-symbolizer --obj=test.elf 0x4004a0 --basenames
193  main
194  test.cpp:15:0
195  $ llvm-symbolizer --obj=test.elf 0x4004a0 --relativenames
196  main
197  foo/test.cpp:15:0
198
199Example 7 - Addresses as symbol names:
200
201.. code-block:: console
202
203  $ llvm-symbolizer --obj=test.elf main
204  main
205  /tmp/test.cpp:14:0
206  $ llvm-symbolizer --obj=test.elf "CODE foz"
207  foz
208  /tmp/test.h:1:0
209
210Example 8 - :option:`--skip-line-zero` output for an address with no line correspondence (an address associated with line zero):
211
212.. code-block:: c
213
214  // test.c
215  int foo = 0;
216  int x = 1234;
217  int main() {
218    if (x)
219      return foo;
220    else
221      return x;
222  }
223
224These files are built as follows:
225
226.. code-block:: console
227
228  $ clang -g -O2 -S test.c -o test.s
229  $ llvm-mc -filetype=obj -triple=x86_64-unknown-linux  test.s -o test.o
230
231.. code-block:: console
232
233  $ llvm-symbolizer --obj=test.o --skip-line-zero 0xa
234  main
235  /tmp/test.c:5:7 (approximate)
236
237OPTIONS
238-------
239
240.. option:: --adjust-vma <offset>
241
242  Add the specified offset to object file addresses when performing lookups.
243  This can be used to perform lookups as if the object were relocated by the
244  offset.
245
246.. option:: --skip-line-zero
247
248  If an address does not have an associated line number, use the last line
249  number from the current sequence in the line-table. Such lines are labeled
250  as "approximate" in the output as they may be misleading.
251
252.. option:: --basenames, -s
253
254  Print just the file's name without any directories, instead of the
255  absolute path.
256
257.. option:: --build-id
258
259  Look up the object using the given build ID, specified as a hexadecimal
260  string. Mutually exclusive with :option:`--obj`.
261
262.. option:: --color [=<always|auto|never>]
263
264  Specify whether to use color in :option:`--filter-markup` mode. Defaults to
265  ``auto``, which detects whether standard output supports color. Specifying
266  ``--color`` alone is equivalent to ``--color=always``.
267
268.. option:: --debug-file-directory <path>
269
270  Provide a path to a directory with a `.build-id` subdirectory to search for
271  debug information for stripped binaries. Multiple instances of this argument
272  are searched in the order given.
273
274.. option:: --debuginfod, --no-debuginfod
275
276  Whether or not to try debuginfod lookups for debug binaries. Unless specified,
277  debuginfod is only enabled if libcurl was compiled in (``LLVM_ENABLE_CURL``)
278  and at least one server URL was provided by the environment variable
279  ``DEBUGINFOD_URLS``.
280
281.. _llvm-symbolizer-opt-C:
282
283.. option:: --demangle, -C
284
285  Print demangled function names, if the names are mangled (e.g. the mangled
286  name `_Z3bazv` becomes `baz()`, whilst the non-mangled name `foz` is printed
287  as is). Defaults to true.
288
289.. option:: --dwp <path>
290
291  Use the specified DWP file at ``<path>`` for any CUs that have split DWARF
292  debug data.
293
294.. option:: --fallback-debug-path <path>
295
296  When a separate file contains debug data, and is referenced by a GNU debug
297  link section, use the specified path as a basis for locating the debug data if
298  it cannot be found relative to the object.
299
300.. option:: --filter-markup
301
302  Reads from standard input, converts contained
303  :doc:`Symbolizer Markup </SymbolizerMarkupFormat>` into human-readable form,
304  and prints the results to standard output. The following markup elements are
305  not yet supported:
306
307  * ``{{{hexdict}}}``
308  * ``{{{dumpfile}}}``
309
310  The ``{{{bt}}}`` backtrace element reports frames using the following syntax:
311
312  ``#<number>[.<inline>] <address> <function> <file>:<line>:<col> (<module>+<relative address>)``
313
314  ``<inline>`` provides frame numbers for calls inlined into the caller
315  corresponding to ``<number>``. The inlined call numbers start at 1 and increase
316  from callee to caller.
317
318  ``<address>`` is an address inside the call instruction to the function.  The
319  address may not be the start of the instruction.  ``<relative address>`` is
320  the corresponding virtual offset in the ``<module>`` loaded at that address.
321
322
323.. _llvm-symbolizer-opt-f:
324
325.. option:: --functions [=<none|short|linkage>], -f
326
327  Specify the way function names are printed (omit function name, print short
328  function name, or print full linkage name, respectively). Defaults to
329  ``linkage``.
330
331.. option:: --help, -h
332
333  Show help and usage for this command.
334
335.. _llvm-symbolizer-opt-i:
336
337.. option:: --inlining, --inlines, -i
338
339  If a source code location is in an inlined function, prints all the inlined
340  frames. This is the default.
341
342.. option:: --no-inlines
343
344  Don't print inlined frames.
345
346.. option:: --no-demangle
347
348  Don't print demangled function names.
349
350.. option:: --obj <path>, --exe, -e
351
352  Path to object file to be symbolized. If ``-`` is specified, read the object
353  directly from the standard input stream. Mutually exclusive with
354  :option:`--build-id`.
355
356.. _llvm-symbolizer-opt-output-style:
357
358.. option:: --output-style <LLVM|GNU|JSON>
359
360  Specify the preferred output style. Defaults to ``LLVM``. When the output
361  style is set to ``GNU``, the tool follows the style of GNU's **addr2line**.
362  The differences from the ``LLVM`` style are:
363
364  * Does not print the column of a source code location.
365
366  * Does not add an empty line after the report for an address.
367
368  * Does not replace the name of an inlined function with the name of the
369    topmost caller when inlined frames are not shown.
370
371  * Prints an address's debug-data discriminator when it is non-zero. One way to
372    produce discriminators is to compile with clang's -fdebug-info-for-profiling.
373
374  ``JSON`` style provides a machine readable output in JSON. If addresses are
375    supplied via stdin, the output JSON will be a series of individual objects.
376    Otherwise, all results will be contained in a single array.
377
378  .. code-block:: console
379
380    $ llvm-symbolizer --obj=inlined.elf 0x4004be 0x400486 -p
381    baz() at /tmp/test.cpp:11:18
382     (inlined by) main at /tmp/test.cpp:15:0
383
384    foo() at /tmp/test.cpp:6:3
385
386    $ llvm-symbolizer --output-style=LLVM --obj=inlined.elf 0x4004be 0x400486 -p --no-inlines
387    main at /tmp/test.cpp:11:18
388
389    foo() at /tmp/test.cpp:6:3
390
391    $ llvm-symbolizer --output-style=GNU --obj=inlined.elf 0x4004be 0x400486 -p --no-inlines
392    baz() at /tmp/test.cpp:11
393    foo() at /tmp/test.cpp:6
394
395    $ clang -g -fdebug-info-for-profiling test.cpp -o profiling.elf
396    $ llvm-symbolizer --output-style=GNU --obj=profiling.elf 0x401167 -p --no-inlines
397    main at /tmp/test.cpp:15 (discriminator 2)
398
399    $ llvm-symbolizer --output-style=JSON --obj=inlined.elf 0x4004be 0x400486 -p
400    [
401      {
402        "Address": "0x4004be",
403        "ModuleName": "inlined.elf",
404        "Symbol": [
405          {
406            "Column": 18,
407            "Discriminator": 0,
408            "FileName": "/tmp/test.cpp",
409            "FunctionName": "baz()",
410            "Line": 11,
411            "StartAddress": "0x4004be",
412            "StartFileName": "/tmp/test.cpp",
413            "StartLine": 9
414          },
415          {
416            "Column": 0,
417            "Discriminator": 0,
418            "FileName": "/tmp/test.cpp",
419            "FunctionName": "main",
420            "Line": 15,
421            "StartAddress": "0x4004be",
422            "StartFileName": "/tmp/test.cpp",
423            "StartLine": 14
424          }
425        ]
426      },
427      {
428        "Address": "0x400486",
429        "ModuleName": "inlined.elf",
430        "Symbol": [
431          {
432            "Column": 3,
433            "Discriminator": 0,
434            "FileName": "/tmp/test.cpp",
435            "FunctionName": "foo()",
436            "Line": 6,
437            "StartAddress": "0x400486",
438            "StartFileName": "/tmp/test.cpp",
439            "StartLine": 5
440          }
441        ]
442      }
443    ]
444
445.. option:: --pretty-print, -p
446
447  Print human readable output. If :option:`--inlining` is specified, the
448  enclosing scope is prefixed by (inlined by).
449  For JSON output, the option will cause JSON to be indented and split over
450  new lines. Otherwise, the JSON output will be printed in a compact form.
451
452  .. code-block:: console
453
454    $ llvm-symbolizer --obj=inlined.elf 0x4004be --inlining --pretty-print
455    baz() at /tmp/test.cpp:11:18
456     (inlined by) main at /tmp/test.cpp:15:0
457
458.. option:: --print-address, --addresses, -a
459
460  Print address before the source code location. Defaults to false.
461
462  .. code-block:: console
463
464    $ llvm-symbolizer --obj=inlined.elf --print-address 0x4004be
465    0x4004be
466    baz()
467    /tmp/test.cpp:11:18
468    main
469    /tmp/test.cpp:15:0
470
471    $ llvm-symbolizer --obj=inlined.elf 0x4004be --pretty-print --print-address
472    0x4004be: baz() at /tmp/test.cpp:11:18
473     (inlined by) main at /tmp/test.cpp:15:0
474
475.. option:: --print-source-context-lines <N>
476
477  Print ``N`` lines of source context for each symbolized address.
478
479  .. code-block:: console
480
481    $ llvm-symbolizer --obj=test.elf 0x400490 --print-source-context-lines=3
482    baz()
483    /tmp/test.cpp:11:0
484    10  :   volatile int k = 42;
485    11 >:   return foz() + k;
486    12  : }
487
488.. option:: --relativenames
489
490  Print the file's path relative to the compilation directory, instead
491  of the absolute path. If the command-line to the compiler included
492  the full path, this will be the same as the default.
493
494.. option:: --verbose
495
496  Print verbose address, line and column information.
497
498  .. code-block:: console
499
500    $ llvm-symbolizer --obj=inlined.elf --verbose 0x4004be
501    baz()
502      Filename: /tmp/test.cpp
503      Function start filename: /tmp/test.cpp
504      Function start line: 9
505      Function start address: 0x4004b6
506      Line: 11
507      Column: 18
508    main
509      Filename: /tmp/test.cpp
510      Function start filename: /tmp/test.cpp
511      Function start line: 14
512      Function start address: 0x4004b0
513      Line: 15
514      Column: 18
515
516.. option:: --version, -v
517
518  Print version information for the tool.
519
520.. option:: @<FILE>
521
522  Read command-line options from response file `<FILE>`.
523
524WINDOWS/PDB SPECIFIC OPTIONS
525-----------------------------
526
527.. option:: --dia
528
529  Use the Windows DIA SDK for symbolization. If the DIA SDK is not found,
530  llvm-symbolizer will fall back to the native implementation.
531
532MACH-O SPECIFIC OPTIONS
533-----------------------
534
535.. option:: --default-arch <arch>
536
537  If a binary contains object files for multiple architectures (e.g. it is a
538  Mach-O universal binary), symbolize the object file for a given architecture.
539  You can also specify the architecture by writing ``binary_name:arch_name`` in
540  the input (see example below). If the architecture is not specified in either
541  way, the address will not be symbolized. Defaults to empty string.
542
543  .. code-block:: console
544
545    $ cat addr.txt
546    /tmp/mach_universal_binary:i386 0x1f84
547    /tmp/mach_universal_binary:x86_64 0x100000f24
548
549    $ llvm-symbolizer < addr.txt
550    _main
551    /tmp/source_i386.cc:8
552
553    _main
554    /tmp/source_x86_64.cc:8
555
556.. option:: --dsym-hint <path/to/file.dSYM>
557
558  If the debug info for a binary isn't present in the default location, look for
559  the debug info at the .dSYM path provided via this option. This flag can be
560  used multiple times.
561
562EXIT STATUS
563-----------
564
565:program:`llvm-symbolizer` returns 0. Other exit codes imply an internal program
566error.
567
568SEE ALSO
569--------
570
571:manpage:`llvm-addr2line(1)`
572