|
|
| |
dwarfdump - dumps DWARF debug information of an ELF object
dwarfdump [options] objectfilename
The dwarfdump command prints or checks DWARF sections as requested by
specific options. With no options (but with the required objectfilename
) all sections print (but some sections cannot be printed independently
safely, so those are only printed at offsets where the .debug_info section
refers to those sections).
As of June 2011 the printing options and the checking options are
mutually exclusive (if checking options are selected the section details are
not printed). When errors are encountered dwarfdump does attempt to print
sufficient context so that one can understand exactly where the error is in
the DWARF. This change makes checking really large object files much
easier.
The format is intended to be human readable. If a script is to
parse the output, the -d option is useful.
Not all sections actually exist in any given object file.
The format may change from release to release, so it is unwise to
depend too heavily on the format.
Frame information (.debug_frame and .eh_frame) is heavily
dependent on the ABI/ISA of the object file. By default we use a generic set
of register names handling up to 100 registers named r0-100. The '-R' option
uses a built-in generic register name set handling up to 1200 registers
named r0-r1199. The '-x abi=<abi>' description below shows how to name
an abi and use that to guide the -f or -F processing. Unless the cpu for the
object file being dumped has many registers, do not use -R or -x abi=generic
as those can be needlessly slow dumping frame sections. Instead, use the
correct abi (if it exists in dwarfdump.conf) or a generic such as -x
abi=generic100 or -x abi=generic500. To get MIPS/IRIX register names names
and call the old version 2 libdwarf frame interface use the option '-x
abi=mips'. Without '-R' or '-x abi=<abi>' dwarfdump ignores the
dwarfdump.conf file and uses compiled-in generic set of register names. If
no '-x name=<path>' is given, dwarfdump looks for
"./dwarfdump.conf", "$HOME/.dwarfdump.conf",
"<install-prefix>/lib/dwarfdump.conf" and takes the first it
finds. If one or more '-x name=<path>' is given the last of these is
used and all other such files are ignored.
If '-x nosanitizestrings' is given then unprintable characters are
not translated to '%xx' (two digit hex preceded by the '%' character) (with
this option bogus characters in strings could cause terminal windows to
behave oddly).
Some -k (checking) options print so-called harmless errors. These
are compiler errors that do not cause any known problem and are only
detected inside libdwarf itself. These are difficult to properly report in
dwarfdump and any error strings may not appear close to the time the error
was encountered.
If zlib compression was used on the DWARF sections in the object
file being read the real section names such as .zdebug_info etc will be
reported by dwarfdump. When dwarfdump says something is at offset 55 of
.zdebug_info (or the like) keep in mind that the offset applies to the
uncompressed section (in memory), not the .zdebug_ compressed section in
objectfilename.
The <objectfilename> and the options taking name strings look for URIs and
translate the URI strings to characters by default (see -x, -c<compiler
name>, -S, -u). So any single % character is treated as if the following
two characters are hex digits representing the underlying true character.
Various characters are meaningful to shells (such as bash or sh) and to getopt
(such as the space character) If the URI translation does anything it prints
the before and after of the URI translation on standard output, so inspection
of the first lines of output will show if URI did anything. The actual options
themselves are assumed to be non-URI. So in the option '-cS&T' the -c
portion must be non-URI, but the & character might cause input issues so
'-cS%26T' could be used instead. To actually input a single % character (in a
name, for example), double it to %% on the command line.
Options -U (turning off URI interpretation) and -q (making finding
URI sequences silent) give finer control of URI interpretation. PP As an
example, to get a string'a b' make the string 'a%20b' (here the quote (') is
for exposition not part of the string, though quote is certainly problematic
in a name). Instead of escaping " quotes in the string, type %25, as in
'a "b' should be typed 'a%20%25b' Any characters can be typed in URI
style, not just characters which are problematic to the shell or getopt. We
strongly suggest you not type URI-style characters where such are not needed
or use the % character itself in command line strings unless you must.
- -a
- Print each section as independently as possible. Sections that can safely
be printed independently (like .debug_abbrev) have relevant info printed
in the report (sometimes dependent on -v).
- -b
- Print the .debug_abbrev section. Because the DWARF specifications do not
rule out garbage data areas in .debug_abbrev (if they are not referenced
from .debug_info) any garbage bytes can result in this print failing.
- -c
- Print locations lists.
- -E
- Print ELF header information and index, address and size for all
sections.
- -Eh
- Effectively does nothing (use another tool to print the Elf file
header).
- -El
- Print index, address and size for the .debug_line section.
- -Ei
- Print index, address and size for the .debug_info section.
- -Ea
- Print index, address and size for the .debug_abbrev section.
- -Ep
- Print index, address and size for the .debug_pubnames section.
- -Er
- Print index, address and size for the .debug_aranges section.
- -Ef
- Print index, address and size for the .debug_frame section.
- -Eo
- Print index, address and size for the .debug_loc section.
- -ER
- Print index, address and size for the .debug_ranges section.
- -Es
- Print index, address and size for the .debug_string section.
- -Et
- Print index, address and size for the .debug_pubtypes section.
- -Ex
- Print index, address and size for the .text section.
- -Ed
- Print index, address and size for the .text and .debug_* sections.
- -f
- Print the .debug_frame section.
- -F
- Print the .eh_frame section.
- -h
- Print IRIX exception tables (unsupported).
- -i
- Print the .debug_info section.
- -I
- Print the .gdb_index, .debug_cu_index, .debug_tu_index sections if any
exist.
- -l
- Print the .debug_info section and the associated line section data.
- -ls
- Print the .debug_info section and the associated line section data, but
omits the <pc> address. Useful when a comparison is required.
- -m
- Print the .debug_macinfo section.
- -N
- Print .debug_ranges section. Because the DWARF specifications do not rule
out garbage data areas in .debug_ranges (if they are not referenced from
.debug_info) any garbage bytes can result in this print failing.
- -p
- Print the .debug_pubnames section.
- -r
- Print the .debug_aranges section.
- -s
- Print .debug_string section.
- -ta
- Print the IRIX only sections .debug_static_funcs and .debug_static_vars.
- -tf
- Print the IRIX only section .debug_static_funcs.
- -tv
- Print the IRIX only section .debug_static_vars.
- -w
- Print the IRIX-only .debug_weaknames section.
- -y
- Print the .debug_pubtypes section (and .debug_typenames, an SGI IRIX-only
section).
Having dwarfdump print relocations may help establish whether
dwarfdump understands any relocations that might exist.
- -o
- Print all relocation records as well as we can manage.
- -oi
- Print .rel*debug_info relocations.
- -ol
- Print .rel*debug_line relocation.
- -op
- Print .rel*debug_pubnames relocation.
- -oa
- Has no effect.
- -or
- Print .rel*debug_aranges relocations.
- -of
- Print .rel*debug_frame relocations.
- -oo
- Print .rel*debug_loc relocations.
- -oR
- Print .rel*debug_ranges relocations.
- -g
- Normally used only for testing libdwarf, this tells dwarfdump to use an
older dwarf_loclist() interface function (a function that cannot handle
all DWARF4 or DWARF5 location lists). Before November 2015 it implied -i,
now you should use -i -g to also get .debug_info printed.
- -V
- Print a dwarfdump date/version string and stop.
- -cg
- Restricts checking to compilers whose producer string starts with 'GNU'
and turns off -cs.
- -cs
- Restricts checking to compilers whose producer string starts with 'SN' and
turns off -cg.
- -cname
- Restricts checking to compilers whose producer string contains 'name' (not
case sensitive). The 'name' is read as a URI string.
- -ka
- Turns on all checking options except -kxe (-kxe might be slow enough one
mignt not want to use it routinely.)
- -kb
- Checks for certain abbreviations section errors when reading DIEs.
- -kc
- Checks for errors in constants in debug_info.
- -kd
- Turns on full reporting of error totals per producer. (the default shows
less detail).
- -kD
- Turns on reporting of duplicated attributes. Duplicated attributes on a
single DW_TAG are improper DWARF, but at least one compiler emitted
such.
- -ke
- Turns on reading pubnames and checking for fde errors.
- -kE
- Checks the integer encoding representation in debug_info, computing
whether these integer values could fit in fewer bytes if represented in
LEB128.
- -kf
- Turns on checking for FDE errors.
- -kF
- Turns on checking for line table errors.
- -kg
- Turns on checking for unused gaps in .debug_info (these gaps are not an
error, just a waste of space).
- -kG
- Print only unique errors. Error lines are simpified (hex numbers removed,
for example) and when a given message string would otherwise appear again
it is suppressed.
- -ki
- Causes a summary of checking results per compiler (producer) to be printed
at the end.
- -kl
- Turns on locations list checking.
- -km
- Turns on checking of ranges.
- -kM
- Turns on checking of aranges.
- -kr
- Turns on DIE tag-attr combinations checking.
- -kR
- Turns on reading DIEs and checking for forward declarations rom
DW_AT_specification attributes. (which are not an error but can be a
source of inefficiency for debuggers).
- -ks
- Turns on extra reporting for some DIE errors checking detects.
- -kS
- Turns on checking DIE references for circular references.
- -kt
- Turns on tag-tag combinations checking.
- -ku
- Print tag-tree and tag-attribute usage (basic format).
- -kuf
- Print tag-tree and tag-attribute usage (full format). For standard TAGs
and ATtributes this presents an overview of how they were used.
- -kx
- Turns on check_frames.
- -kxe
- Turns off basic check_frames and turns on extended frame checking.
- -ky
- Turns on type_offset, decl_file checking,
- -C
- Normally when checking for tag-tag or tag-attribute combinations both the
standard combinations and some common extensions are allowed. With -C the
extensions are taken out of the allowed class of combinations.
- -d
- When printing DIEs, put all the attributes for each DIE on the same (long)
line as the TAG. This makes searching for DIE information (as with grep)
much simpler as the entire DIE is on one line.
- -D
- Turns off the display of section offsets and attribute values in printed
output. So the .debug_info output is just TAGs and Attributes. For
pubnames (and the like) it removes offsets from the output. For locations
lists it removes offsets from the output, but that is useless since the
attribute values don't show so neither does the location data.
- -e
- Turns on truncation of attribute and tag names. For example DW_TAG_foo
becomes foo. Not compatible with checking, only useful for printing DIEs.
- -G
- When printing, add global offsets to the offsets printed.
- -H number
- When printing or checking .debug_info, this terminates the search after
'number' compilation units. When printing frame information this
terminates the FDE reporting after 'number' FDEs and the CIE reporting
(which occurs if one adds -v) after 'number' CIEs. Example '-H 1'
- -M
- When printing, this means one want to have the FORM show for each
attribute. If a -v is also added (or more than one) then details of any
form indirection are also shown.
- -n
- When printing frames, this turns off the search for function names. In a
really large object the search can take more time than one wants to wait,
so this avoids the search.
- -O file=<path>
- The <path> will be used as the file name for output instead of
writing to stdout (stdout is the default).
- -Q
- Suppresses section data printing (set automatically with a checking
option).
- -R
- When printing frames for ABIs with lots of registers, this allows up to
1200 registers to be named (like R999) without choosing an ABI with, for
example '-x abi=ppc'
- -v
- Increases the detail shown when printing. In some sections, using more -v
options will increase the detail (one to three are useful) or may change
the report to show, for example, the actual line-data-commands instead of
the resultant line-table.
These -S options stand alone and basic print information about the compilation
unit and DIE where the string(s) appear. At most one of each of the following
is effective (so for example one can only have one 'match', but one can have a
'match', an 'any', and a 'regex'). Any -S causes the .debug_info section to be
inspected. No checking options or printing options should be supplied with -S.
If v is added to the -S option, the number of occurrences is
printed. (see below for an example).
- -S match=string
- When printing DIEs for each tag value or attribute name that matches
'string' exactly print the compilation unit information and its section
offset. Any CU with no match is not printed. The 'string' is read as a URI
string.
- -S any=string
- When printing DIEs for each tag value or attribute name that contains
'string' somewhere in the tag or attribute (case insensitive) print the
compilation unit information and its section offset. Any CU with no match
is not printed. The 'string' is read as a URI string.
- -S regex=string
- When printing DIEs for each tag value or attribute name where the 'string'
reqular expression matches print the compilation unit information and its
section offset. Any CU with no match is not printed. The 'string' is read
as a URI string.
The string cannot have spaces or other characters which are
meaningful to getopt(3) and the shell will strip off quotes and other
characters. So the string is assumed to be in URI style and is translated.
In other words, to match 'a b' make the -S string 'a%20b' Instead of
escaping " quotes in the string, type %25, as in
'a "b' should be typed 'a%20%25b' (the ' are for exposition here, not
part of the strings). Any characters can be typed in URI style, not just
characters which are problematic to the shell or getopt.
The -S any= and -S regex= options are only usable if the library
functions required are found at configure time.
The -W option is a modifier to the -S option, and increases the
amount of output -W prints. An example v modifier to the -S option is shown
below. And we show the -W in context with a -S option.
- -S vmatch=string1
- Prints information about the DIEs that -S matches and prints the count of
occurrences
- -S match=string1 -W
- Prints the parent tree and the children tree for the DIEs that -S matches.
- -S match=string2 -Wp
- Prints the parent tree for the DIEs that -S matches.
- -S match=string3 -Wc
- Prints the parent tree for the DIEs that -S matches.
- -# number
- This option controls internal debugging output, higher numbers mean more
debug actions. See the source code.
- -x name=/p/a/t/h.conf
- The file path given is the name of a file assumed to be a
dwarfdump.conf-like file. The file path is read as a URI string.
- -x abi=ppc
- Selects the abi (from a dwarfdump.conf file) to be used in printing frame
information (here using ppc as an example). The abi is read as a URI
string.
- -x tied=/t/i/depath
- Used when opening a main object that is a .dwo or .dwp file. The tied file
path names the executable which has the .debug_addr section that may be
referred to from the main object. See Split Objects (aka Debug
Fission).
- -x line5=s2l
- Normally used only to test libdwarf interfaces. There are 4 different
interface function sets and to ensure they all work this option lets us
choose which to use. The options are 's2l' (default, Allows standard and
two-level line tables using the latest interface functions), 'std' (Allows
standard single level line tables using the latest interface functions),
'orig' (allows DWARF2,3,4 original line tables using an older interface
function set), 'orig2l' (allows original line tables and some two-level
line tables using an older interface set).
- -P
- When checking this adds the list of compilation-unit names seen for each
producer-compiler to the printed checking results.
- -q
- When a URI is found and translated while reading the command line, be
quiet about the URI translation. That is, don't print the original and
translated option strings.
- -E
- Turns on printing object-internal header data for some systems (for
Unix/Linux does nothing).
- -u cuname
- Turns on selective printing of DIEs (printing like -i). Only the DIEs for
a compilation unit that match the name provided are printed. If the
compilation unit is ./a/b/c.c the 'cuname' you provide should be c.c as
the characters through the final path-separating / are ignored. If
'cuname' begins with a / then the entire name string of a compilation unit
must match 'cuname'. The 'cuname' is read as a URI string.
- -U
- Turn off the URI interpretation of the command line strings entirely. Must
be be on the command line before any URI strings encountered to be fully
effective.
- -z
- No longer supported.
dwarfdump
./dwarfdump.conf
$(HOME)/.dwarfdump.conf
$(HOME)/dwarfdump.conf
<install-prefix>/lib/dwarfdump.conf
In some cases compilers use DW_FORM_data1 (for example) and in such cases the
signedness of the value must be taken from context. Rather than attempt to
determine the context, dwarfdump prints the value with both signednesses
whenever there is ambiguity about the correct interpretation. For example,
"DW_AT_const_value 176(as signed = -80)". For normal DWARF consumers
that correctly and fully evaluate all attributes there is no ambiguity of
signedness: the ambiguity for dwarfdump is due to dwarfdump evaluating DIEs in
a simple order and not keeping track of much context.
Support for DWARF3 is being completed but may not be complete.
Visit the GSP FreeBSD Man Page Interface. Output converted with ManDoc. |