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`.

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, or if at any time an input value is not recognized, the input is simply
echoed to the output.

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`).

.. code-block:: c

  // test.h
  extern "C" inline int foz() {
    return 1234;
  }

.. code-block:: 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:

.. code-block:: console

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

Example 1 - addresses and object on command-line:

.. code-block:: 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:

.. code-block:: 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:

.. code-block:: 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:

.. code-block:: 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:

.. code-block:: 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.

.. code-block:: 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

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:: --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:: --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
  coresponding 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.

  .. code-block:: 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:: --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.

  .. code-block:: 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.

  .. code-block:: 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.

  .. code-block:: 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.

  .. code-block:: 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), 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). If the architecture is not specified in either
  way, the address will not be symbolized. Defaults to empty string.

  .. code-block:: console

    $ cat addr.txt
    /tmp/mach_universal_binary:i386 0x1f84
    /tmp/mach_universal_binary:x86_64 0x100000f24

    $ llvm-symbolizer < addr.txt
    _main
    /tmp/source_i386.cc:8

    _main
    /tmp/source_x86_64.cc:8

.. 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)`
