| # llvm-symbolizer - convert addresses into source code locations | |
| :::{program} llvm-symbolizer | |
| ::: | |
| ## SYNOPSIS | |
| {program}`llvm-symbolizer` \[*options*\] \[*addresses...*\] | |
| ## DESCRIPTION | |
| {program}`llvm-symbolizer` reads input names and addresses from the command-line | |
| and prints corresponding source code locations to standard output. It can also | |
| symbolize logs containing {doc}`Symbolizer Markup </SymbolizerMarkupFormat>` via | |
| {option}`--filter-markup`. Addresses may be specified as numbers or symbol names. | |
| If no address is specified on the command-line, it reads the addresses from | |
| standard input. If no input name is specified on the command-line, but addresses | |
| are, the first address value is treated as an input name. If an input value is not | |
| recognized, it reports that source information is not found. | |
| Input names can be specified together with the addresses either on standard | |
| input or as positional arguments on the command-line. By default, input names | |
| are interpreted as object file paths. However, prefixing a name with | |
| `BUILDID:` states that it is a hex build ID rather than a path. This will look | |
| up the corresponding debug binary. For consistency, prefixing a name with | |
| `FILE:` explicitly states that it is an object file path (the default). | |
| A positional argument or standard input value can be preceded by "DATA" or | |
| "CODE" to indicate that the address should be symbolized as data or executable | |
| code respectively. If neither is specified, "CODE" is assumed. DATA is | |
| symbolized as address and symbol size rather than line number. | |
| {program}`llvm-symbolizer` parses options from the environment variable | |
| `LLVM_SYMBOLIZER_OPTS` after parsing options from the command line. | |
| `LLVM_SYMBOLIZER_OPTS` is primarily useful for supplementing the command-line | |
| options when {program}`llvm-symbolizer` is invoked by another program or | |
| runtime. | |
| ## EXAMPLES | |
| All of the following examples use the following two source files as input. They | |
| use a mixture of C-style and C++-style linkage to illustrate how these names are | |
| printed differently (see {option}`--demangle`). | |
| ```c | |
| // test.h | |
| extern "C" inline int foz() { | |
| return 1234; | |
| } | |
| ``` | |
| ```c | |
| // 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(); | |
| } | |
| ``` | |
| These files are built as follows: | |
| ```console | |
| $ clang -g test.cpp -o test.elf | |
| $ clang -g -O2 test.cpp -o inlined.elf | |
| ``` | |
| Example 1 - addresses and object on command-line: | |
| ```console | |
| $ llvm-symbolizer --obj=test.elf 0x4004d0 0x400490 | |
| foz | |
| /tmp/test.h:1:0 | |
| baz() | |
| /tmp/test.cpp:11:0 | |
| ``` | |
| Example 2 - addresses on standard input: | |
| ```console | |
| $ 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 | |
| ``` | |
| Example 3 - object specified with address: | |
| ```console | |
| $ 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 | |
| ``` | |
| Example 4 - BUILDID and FILE prefixes: | |
| ```console | |
| $ 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 | |
| ``` | |
| Example 5 - CODE and DATA prefixes: | |
| ```console | |
| $ 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 | |
| ``` | |
| Example 6 - path-style options: | |
| This example uses the same source file as above, but the source file's | |
| full path is /tmp/foo/test.cpp and is compiled as follows. The first case | |
| shows the default absolute path, the second --basenames, and the third | |
| shows --relativenames. | |
| ```console | |
| $ 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 | |
| ``` | |
| Example 7 - Addresses as symbol names: | |
| ```console | |
| $ 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 | |
| ``` | |
| Example 8 - {option}`--skip-line-zero` output for an address with no line correspondence (an address associated with line zero): | |
| ```c | |
| // test.c | |
| int foo = 0; | |
| int x = 1234; | |
| int main() { | |
| if (x) | |
| return foo; | |
| else | |
| return x; | |
| } | |
| ``` | |
| These files are built as follows: | |
| ```console | |
| $ clang -g -O2 -S test.c -o test.s | |
| $ llvm-mc -filetype=obj -triple=x86_64-unknown-linux test.s -o test.o | |
| ``` | |
| ```console | |
| $ llvm-symbolizer --obj=test.o --skip-line-zero 0xa | |
| main | |
| /tmp/test.c:5:7 (approximate) | |
| ``` | |
| ## OPTIONS | |
| :::{option} --adjust-vma <offset> | |
| Add the specified offset to object file addresses when performing lookups. | |
| This can be used to perform lookups as if the object were relocated by the | |
| offset. | |
| ::: | |
| :::{option} --skip-line-zero | |
| If an address does not have an associated line number, use the last line | |
| number from the current sequence in the line-table. Such lines are labeled | |
| as "approximate" in the output as they may be misleading. | |
| ::: | |
| :::{option} --basenames, -s | |
| Print just the file's name without any directories, instead of the | |
| absolute path. | |
| ::: | |
| :::{option} --build-id | |
| Look up the object using the given build ID, specified as a hexadecimal | |
| string. Mutually exclusive with {option}`--obj`. | |
| ::: | |
| :::{option} --color [=<always|auto|never>] | |
| Specify whether to use color in {option}`--filter-markup` mode. Defaults to | |
| `auto`, which detects whether standard output supports color. Specifying | |
| `--color` alone is equivalent to `--color=always`. | |
| ::: | |
| :::{option} --debug-file-directory <path> | |
| Provide a path to a directory with a `.build-id` subdirectory to search for | |
| debug information for stripped binaries. Multiple instances of this argument | |
| are searched in the order given. | |
| ::: | |
| :::{option} --debuginfod, --no-debuginfod | |
| Whether or not to try debuginfod lookups for debug binaries. Unless specified, | |
| debuginfod is only enabled if libcurl was compiled in (`LLVM_ENABLE_CURL`) | |
| and at least one server URL was provided by the environment variable | |
| `DEBUGINFOD_URLS`. | |
| ::: | |
| (llvm-symbolizer-opt-c)= | |
| :::{option} --demangle, -C | |
| Print demangled function names, if the names are mangled (e.g. the mangled | |
| name `_Z3bazv` becomes `baz()`, whilst the non-mangled name `foz` is printed | |
| as is). Defaults to true. | |
| ::: | |
| :::{option} --dwp <path> | |
| Use the specified DWP file at `<path>` for any CUs that have split DWARF | |
| debug data. | |
| ::: | |
| :::{option} --fallback-debug-path <path> | |
| When a separate file contains debug data, and is referenced by a GNU debug | |
| link section, use the specified path as a basis for locating the debug data if | |
| it cannot be found relative to the object. | |
| ::: | |
| :::{option} --filter-markup | |
| Reads from standard input, converts contained | |
| {doc}`Symbolizer Markup </SymbolizerMarkupFormat>` into human-readable form, | |
| and prints the results to standard output. The following markup elements are | |
| not yet supported: | |
| - `{{{hexdict}}}` | |
| - `{{{dumpfile}}}` | |
| The `{{{bt}}}` backtrace element reports frames using the following syntax: | |
| `#<number>[.<inline>] <address> <function> <file>:<line>:<col> (<module>+<relative address>)` | |
| `<inline>` provides frame numbers for calls inlined into the caller | |
| corresponding to `<number>`. The inlined call numbers start at 1 and increase | |
| from callee to caller. | |
| `<address>` is an address inside the call instruction to the function. The | |
| address may not be the start of the instruction. `<relative address>` is | |
| the corresponding virtual offset in the `<module>` loaded at that address. | |
| ::: | |
| (llvm-symbolizer-opt-f)= | |
| :::{option} --functions [=<none|short|linkage>], -f | |
| Specify the way function names are printed (omit function name, print short | |
| function name, or print full linkage name, respectively). Defaults to | |
| `linkage`. | |
| ::: | |
| :::{option} --help, -h | |
| Show help and usage for this command. | |
| ::: | |
| (llvm-symbolizer-opt-i)= | |
| :::{option} --inlining, --inlines, -i | |
| If a source code location is in an inlined function, prints all the inlined | |
| frames. This is the default. | |
| ::: | |
| :::{option} --no-inlines | |
| Don't print inlined frames. | |
| ::: | |
| :::{option} --no-demangle | |
| Don't print demangled function names. | |
| ::: | |
| :::{option} --obj <path>, --exe, -e | |
| Path to object file to be symbolized. If `-` is specified, read the object | |
| directly from the standard input stream. Mutually exclusive with | |
| {option}`--build-id`. | |
| ::: | |
| (llvm-symbolizer-opt-output-style)= | |
| :::{option} --output-style <LLVM|GNU|JSON> | |
| Specify the preferred output style. Defaults to `LLVM`. When the output | |
| style is set to `GNU`, the tool follows the style of GNU's **addr2line**. | |
| The differences from the `LLVM` style are: | |
| - Does not print the column of a source code location. | |
| - Does not add an empty line after the report for an address. | |
| - Does not replace the name of an inlined function with the name of the | |
| topmost caller when inlined frames are not shown. | |
| - Prints an address's debug-data discriminator when it is non-zero. One way to | |
| produce discriminators is to compile with clang's -fdebug-info-for-profiling. | |
| `JSON` style provides a machine-readable output in JSON. If addresses are | |
| : supplied via stdin, the output JSON will be a series of individual objects. | |
| Otherwise, all results will be contained in a single array. | |
| ```console | |
| $ 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 | |
| } | |
| ] | |
| } | |
| ] | |
| ``` | |
| ::: | |
| :::{option} --pdb <path> | |
| Use the specified PDB file at `<path>`, overriding the PDB info | |
| contained in the COFF object. | |
| ::: | |
| :::{option} --pretty-print, -p | |
| Print human-readable output. If {option}`--inlining` is specified, the | |
| enclosing scope is prefixed by (inlined by). | |
| For JSON output, the option will cause JSON to be indented and split over | |
| new lines. Otherwise, the JSON output will be printed in a compact form. | |
| ```console | |
| $ 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 | |
| ``` | |
| ::: | |
| :::{option} --print-address, --addresses, -a | |
| Print address before the source code location. Defaults to false. | |
| ```console | |
| $ 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 | |
| ``` | |
| ::: | |
| :::{option} --print-source-context-lines <N> | |
| Print `N` lines of source context for each symbolized address. | |
| ```console | |
| $ 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 : } | |
| ``` | |
| ::: | |
| :::{option} --relativenames | |
| Print the file's path relative to the compilation directory, instead | |
| of the absolute path. If the command-line to the compiler included | |
| the full path, this will be the same as the default. | |
| ::: | |
| :::{option} --verbose | |
| Print verbose address, line and column information. | |
| ```console | |
| $ 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 | |
| ``` | |
| ::: | |
| :::{option} --version, -v | |
| Print version information for the tool. | |
| ::: | |
| :::{option} @<FILE> | |
| Read command-line options from response file `<FILE>`. | |
| ::: | |
| ## WINDOWS/PDB SPECIFIC OPTIONS | |
| :::{option} --dia | |
| Use the Windows DIA SDK for symbolization. If the DIA SDK is not found, | |
| llvm-symbolizer will fall back to the native implementation. | |
| ::: | |
| ## MACH-O SPECIFIC OPTIONS | |
| :::{option} --default-arch <arch> | |
| If a binary contains object files for multiple architectures (e.g. it is a | |
| Mach-O universal binary or an archive with architecture variants), | |
| symbolize the object file for a given architecture. You can also specify | |
| the architecture by writing `binary_name:arch_name` in the input (see | |
| example below). For archives, the format `archive.a(member.o):arch` | |
| is also supported. If the architecture is not specified, | |
| the address will not be symbolized. Defaults to empty string. | |
| ```console | |
| $ 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 | |
| ``` | |
| ::: | |
| :::{option} --dsym-hint <path/to/file.dSYM> | |
| If the debug info for a binary isn't present in the default location, look for | |
| the debug info at the .dSYM path provided via this option. This flag can be | |
| used multiple times. | |
| ::: | |
| ## EXIT STATUS | |
| {program}`llvm-symbolizer` returns 0. Other exit codes imply an internal program | |
| error. | |
| ## SEE ALSO | |
| {manpage}`llvm-addr2line(1)` | |