Commit graph

2156 commits

Author SHA1 Message Date
Zequan Wu
22f54f197f [dump_syms] Handle DW_TAG_lexical_block to caputre inline info inside.
Bug: b/317143556
Change-Id: Iba82712fedf7d126c2392cfc0f157ded2bca5219
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/5171059
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
2024-01-05 18:23:00 +00:00
Nathan Moinvaziri
062f7124f6 Fixed arch_utilities.cc compilation for Linux.
Availability.h and AvailabilityMacros.h are only available when
compiling on Apple.

Change-Id: I820c74a7fa15560c358366418a503b911dde3d86
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/5171145
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
2024-01-04 23:54:29 +00:00
Nathan Moinvaziri
83d9816eb4 Fixed compilation if mach-o/utils.h is unavailable.
Change-Id: Id22814308542503754600c2fa41e76bd6d1492c0
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/5143028
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
2024-01-03 20:54:23 +00:00
Nathan Moinvaziri
7fb7589914 Allow breakpad to read extended x86 contexts
Minidumps can contain extended contexts with xstate data for amd64 and
x86.

Support for amd64 contexts was added in
fe35cd43f2.

With this change, breakpad can now read x86 minidumps that contain
extended xstate data. Similar to the previously mentioned commit, this
change does not yet add processing for this extra data, but will allow
the minidumps to be read.

Change-Id: Ie96e91168def774092e05908535a70fc5e2427e9
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/5154022
Reviewed-by: Mike Frysinger <vapier@chromium.org>
2024-01-03 20:53:24 +00:00
Nathan Moinvaziri
225ed9172e Force dump_syms output to be checked out with LF line-ending.
Otherwise, even with core.autocrlf=false, Windows will checkout these minidump output files with CRLF line-ending. It is necessary for these
files to be checked out using LF line-ending for the unit tests to pass.

Change-Id: I7cacf4b5fa56e007c8aa81202e0cef7ad42ae93a
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/5160534
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
2024-01-03 20:53:15 +00:00
Nathan Moinvaziri
048e14caf8 Add command line switch for reporting DWARF warnings.
Change-Id: Ibcf1b0ddb93f1cf6bf12681ed82871328571f2aa
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/5137659
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
2024-01-03 20:51:17 +00:00
Nathan Moinvaziri
446298620b Disable ContextDeathTest on Windows due to regex support.
Windows doesn't have posix regex support. This will disable these tests so long as Google's ABSL library is not also found.

Change-Id: Ie6f96d5ea74b80b6128c2f1ec3ed54fcfaa17f47
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/5160533
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
2024-01-03 01:28:16 +00:00
Nathan Moinvaziri
8e125760dc Fixed opening minidump on Windows in MinidumpTest.TestMinidumpFromStream
Minidump file needs to be opened as binary.

Change-Id: I15f148ec905c9491050b77a77e86e2749da93515
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/5160989
Reviewed-by: Sterling Augustine <saugustine@google.com>
2024-01-02 22:33:42 +00:00
Nathan Moinvaziri
898a997855 Fixed missing include for std::find_if.
Throws an error when compiling on Windows.

Change-Id: Ieb34c00cf199aaa1b45a440086c48b8ed363b3c7
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/5137658
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
2024-01-02 19:39:39 +00:00
Nathan Moinvaziri
ed1d564c9e Fixed high AddressType variable used without being assigned
In RangeMap::StoreRangeInternal, when size <= 0 and !high_ok then the
high variable is passed to HexString uninitialized.

Change-Id: I7e597cadaf248b607c646534a5d800c17ccdeda9
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/5155712
Reviewed-by: Robert Sesek <rsesek@chromium.org>
2024-01-02 13:32:05 +00:00
Mark Brand
11ec9c3288 Fix stack walking using StackwalkerAddressList.
When building a stack trace using StackwalkerAddressList, if there are
inlined frames then the stack trace will skip over the following
frames, leading to missing frames in the symbolized stacktraces.

Bug: 314930064
Change-Id: I5c7a1b2e7c2f728e27b2082e77ebe953808f38bc
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/5087692
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-12-11 16:08:46 +00:00
Ivan Penkov
f49c2f1a20 The ARM64 stack walker was doing an illegal down cast from base-class (StackFrame) to derived-class (StackFrameARM64).
Inline frames are always of the base-class type (StackFrame). Treating them as derived-class and accessing members is causing buffer overflows.

Change-Id: Ib41b74256e6162e7d2b14ca3905dfaf5591b9c86
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4847317
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-09-06 20:16:57 +00:00
Ivan Penkov
e35d1d09ae Fix -Wunguarded-availability warnings.
Change-Id: I400130d67acea47158b9ba4f5703c7e9bc2cbb79
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4811217
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-08-24 23:39:25 +00:00
Petr Hosek
922d49bdfe Update scripts to Python 3
Python 2 is deprecated and have now been removed from CI builders.

Change-Id: Ic838714502e16136bd8ed345a47a00b71ff889aa
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4754416
Reviewed-by: Mike Frysinger <vapier@chromium.org>
2023-08-06 02:45:49 +00:00
Peter Collingbourne
8f6b252722 Add support for new SEGV_* constants to minidump_stackwalk.
Bug: chromium:1137393
Change-Id: I1a6a5f2013e6a08e189958b89415183ffb6fe345
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4722972
Reviewed-by: Mark Mentovai <mark@chromium.org>
2023-08-02 17:05:02 +00:00
Marc Gonzalez
d10ef76a38 linux_dumper: Always map ELF file from offset 0
Functions such as FindElfSection and FindElfSegments that inspect
the ELF header expect a pointer to the first byte of the file.
IsValidElf() checks for the ELF magic number at offset 0.
Thus, we must map ELF object files from offset 0.

Change-Id: Icebfb46229a04019f57a7ec07844257b98ceb278
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4674337
Reviewed-by: Mike Frysinger <vapier@chromium.org>
2023-08-02 15:10:08 +00:00
Marc Gonzalez
0d0354463e libdisasm: Widen STRNCATF temp buffer
The _tmp buffer used in STRNCATF is too small for several callers,
which might lead to truncated output in some situations.

For example, GCC 11 warns:

src/third_party/libdisasm/x86_format.c:899:40: warning: ‘%s’ directive output may be truncated writing up to 63 bytes into a region of size 32 [-Wformat-truncation=]
  899 |                         STRNCATF( buf, "%s:", str, len );
      |                                        ^~~~~  ~~~
src/third_party/libdisasm/x86_format.c:34:38: note: in definition of macro ‘STRNCATF’
   34 |         snprintf( _tmp, sizeof _tmp, fmt, data );   \
      |                                      ^~~
src/third_party/libdisasm/x86_format.c:899:41: note: format string is defined here
  899 |                         STRNCATF( buf, "%s:", str, len );
      |                                         ^~
In file included from /usr/include/stdio.h:894,
                 from src/third_party/libdisasm/x86_format.c:1:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:10: note: ‘__builtin___snprintf_chk’ output between 2 and 65 bytes into a destination of size 32
   71 |   return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   72 |                                    __glibc_objsize (__s), __fmt,
      |                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   73 |                                    __va_arg_pack ());
      |                                    ~~~~~~~~~~~~~~~~~

Change-Id: Ia876e288bf9629f2c72db3faf2287c7940924ea0
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4668735
Reviewed-by: Mike Frysinger <vapier@chromium.org>
2023-08-02 14:55:51 +00:00
Ian McKellar
9ea5b228f5 Add support for zstd compressed sections to dump_syms
Support for zstd must be enabled by passing --enable-zstd to configure.

Change-Id: I57d0196552284de86575d979d673ac20a3fc4d64
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4722191
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-07-27 18:14:10 +00:00
Marc Gonzalez
7a1a190f4f Fix warnings in configure.ac
Fix warnings on Ubuntu 22.04

Change-Id: I2f64988706e72838b4e2cec50d0bde9eb90929ad
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4668734
Reviewed-by: Mike Frysinger <vapier@chromium.org>
2023-07-06 15:51:57 +00:00
Zequan Wu
8988364bcd Fix bug when ranges_data is index 0 in DW_AT_ranges.
Bug: chromium:1448979
Change-Id: Ib174ab1592d189e0f05e6baa6a96af2742d00eda
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4580929
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-06-01 19:19:34 +00:00
Zequan Wu
a9bb984785 Share .debug_line and .debug_line_str among dwp file and main binary file.
The debug info in the dwp file needs to refer to the .debug_line and
.debug_line_str sections in the main binary.

This fixes dump_syms not generating LINE records for dwp in split dwarf.

Bug: chromium:1448979
Change-Id: I71923f12cea72caae081c1406e2cbca55e95859e
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4576346
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-05-31 20:27:11 +00:00
Ben Hamilton
18aa6faf2e [Breakpad] Fix hex formatting for MinidumpCrashpadInfo::Print()
The hex formatting in MinidumpCrashpadInfo::Print() was missing
the leading 0, so byte values < 128 were not possible to decode.

Change-Id: Ib355bcdaf86e91d644045df645fb4fa75332aa4b
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4571100
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-05-26 16:34:47 +00:00
Zequan Wu
02fe1eef8e Fix reading DW_AT_ranges in split dwarf.
Bug: b/280290608, chromium:1448979
Change-Id: I3f9e4c3d62b4c858238ccbbda0366926c306e27f
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4568824
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-05-25 20:59:53 +00:00
Mark Brand
6857c7c65f Properly initialize enable_objdump_for_exploitability_
Change-Id: I30fab42e2a1e7d0abf970b825e66a0db8b6a0fd5
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4557444
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-05-23 15:29:12 +00:00
Thomas Gales
64a53c1904 Modify RISCV minidump context to match Crashpad
- RISCV32 will only include support for 32 bit floating point registers
- RISCV64 will only include support for 64 bit floating point registers
- RISCV 32/64 context will include a "version" field to account for
  future extensions

Fixed: 1447862

Tested: `make check` on x86 host
Tested: `minidump_stackwalk` for RISCV64 minidump on x86 host
Change-Id: I605d5b2c35e627a5dc986aaf818a9c9898f6ae0b
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4553281
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-05-23 15:24:16 +00:00
Richard Nichols
8267ac6510 Fix minidump generation on arm softfp targets.
Test: arm softfp build, crashed program intentionally with kill -4 and
observed successful minidump generation.
Bug: b/283473162
Change-Id: Id71f92653ced04575ffbb87e309d4139ca34d843
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4545508
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-05-19 17:45:08 +00:00
Zequan Wu
9f96d5c7b7 Fix inline_origin_map key collision when split dwarf is enabled.
It fixes following two problems:
1. When we have skeleton compilation unit (DW_TAG_skeleton_unit) in a
binary file refers to the complete unit in a split dwarf file
(.dwo/.dwp file), we should use the split dwarf file's path in warning
reporting. Right now, it uses the original file (binary file) path in
warning report, which is incorrect.

For example, if we have chrome.debug which is the binary with skeleton
debug info and chrome.dwp which is the complete debug info and the debug
info in chrome.dwp has some incorrect reference, it will warn on
chrome.debug rather than chrome.dwp

2. When split dwarf is enabled, the global inline_origin_map will likely
encounter key collision because the offsets as keys are now relative to
each CU's offset which is relative to .debug_info section. Also
offsets from different files might collide.

This change makes a inline_origin_map for each debug file and use
offsets only relative to .debug_info section as keys.

Bug: b/280290608
Change-Id: If70e2e1bfcbeeeef2d425c918796d351a0e9ab3b
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4544694
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
Reviewed-by: Mark Mentovai <mark@chromium.org>
2023-05-19 17:05:35 +00:00
Leonard Grey
38b6eebda1 Mac: shorten sym file names in upload_system_symbols
macOS caps filenames at 255 characters. When upload_system_symbols runs
`dump_syms`, the resulting filename is based on a mangled version of
the file's full path. In some circumstances (for example, the dumped
file itself lives in a temp directory), this name can exceed the max.

This change replaces the current mangling by mapping each path component but the last to its first initial, greatly shortening
the resulting filename.

Bug: 1400770
Change-Id: I68203a98eda2912893c5d8f7c676faee17e39e91
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4519231
Reviewed-by: Robert Sesek <rsesek@chromium.org>
2023-05-18 21:12:03 +00:00
Lei Zhang
5850e262b1 Modernize code
- Replace DISALLOW_COPY_AND_ASSIGN with =delete.
- Replace some NULLs with nullptrs;
- Use the override keyword when appropriate.
- Use =default when appropriate.

Change-Id: I99e1d7f349dd4c32aa5d05e2ebdce7a86e47f551
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4527718
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
2023-05-12 18:17:39 +00:00
Mark Brand
463ae7cd60 Add new flag to allow granular control over the use of objdump.
This adds a new flag `enable_objdump_for_exploitability_` to the
MinidumpProcessor, which allows enabling objdump separately for crash
address fixups and for exploitability analysis, as the performance cost
of the exploitability analysis is significantly higher.

Change-Id: I667ffdce7cc0a970793f91413c3d2e3af93f4247
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4507067
Reviewed-by: Ivan Penkov <ivanpe@google.com>
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
2023-05-10 01:19:51 +00:00
Mark Brand
f4a3b346f3 [dump_syms][riscv] Update unittest.
Change 4505156 changed the RISCV register names, this change adjusts
the unittest to match the new names.

Bug: 1432426
Change-Id: I0887d8fc11eec63ab6953ea1a136873591e49286
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4507066
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-05-08 15:20:15 +00:00
Thomas Gales
5b101544ca [dump_syms][riscv] Fix register name mismatch
dump_syms was using x0...x31 notation, while the rest of Breakpad was
using the ABI names. This mismatch was causing stackwalking to not fully
succeed.

Fixed: 1432426
Change-Id: I0713e76e65ff6dad492b51bc3607e94e25dc2c3a
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4505156
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-05-05 01:13:24 +00:00
Ben Wagner
837b0f5d52 Fix MDRawCrashpadAnnotationList::objects type
MDRawCrashpadAnnotationList::objects is a flexible array of
MDRawCrashpadAnnotation and not MDLocationDescriptor. Breakpad does not
currently use the MDRawCrashpadAnnotationList type, but its definition
should be updated to reflect the correct type to avoid confusion.

Change-Id: I58b5b0e4f7f95bc003b103e2750e3759c3e31292
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4503630
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-05-03 20:38:08 +00:00
Ben Wagner
6e319cac57 Fix MDRawModuleCrashpadInfoList::modules type
MDRawModuleCrashpadInfoList::modules is a flexible array of
MDRawModuleCrashpadInfoLink and not MDLocationDescriptor. Breakpad does
not currently use the MDRawModuleCrashpadInfoList type, but its
definition should be updated to reflect the correct type to avoid
confusion.

Change-Id: If97f490db8d41529b59a225a275a37116746c2b7
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4504150
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-05-03 19:25:20 +00:00
Leonard Grey
3ea3af42d3 Include iOS in availability checks for mach-o/util.h calls
Bug: chromium:1420654
Change-Id: Id0281089962147040b6332223bf4593bf4fc60cd
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4500259
Reviewed-by: Mark Mentovai <mark@chromium.org>
2023-05-03 12:04:16 +00:00
Peter Boström
e9eb843f42 Fix dump_syms help typo on Linux
Bug: None
Change-Id: I0409a0c2ab8e60b1f84f72b50a1fd400b5a41cbd
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4500379
Reviewed-by: Mark Mentovai <mark@chromium.org>
2023-05-02 20:26:33 +00:00
Leonard Grey
99cd657eec Reimport architecture/byte_order.h from canonical repo
Bug: b/257505171
Change-Id: I210b6689683ff2cf561997584924fd9b568943cb
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4494631
Reviewed-by: Mark Mentovai <mark@chromium.org>
2023-05-01 22:51:23 +00:00
Ben Wagner
de040fa25d minidump-2-core: Use exception context for crashed thread
Use the exception record's context for the crashed thread instead of
the thread's own context. For the crashed thread the thread's own
context is the state inside the exception handler. Using it would not
result in the expected stack trace from the time of the crash.

This change aligns the behavior of minidump-2-core with the behavior of
minidump_stackwalk.

Bug: google-breakpad:885
Change-Id: I5cd3e9d39807308491b64fcd335f5f85b1dcd084
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4473128
Reviewed-by: Joshua Peraza <jperaza@google.com>
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-04-28 18:35:40 +00:00
Ben Wagner
68f5a4d11a Fix AMD64/X86 typo in MD_CONTEXT_AMD64_ALL
Use MD_CONTEXT_AMD64_DEBUG_REGISTERS instead of
MD_CONTEXT_AMD64_DEBUG_REGISTERS in the definition of
MD_CONTEXT_AMD64_ALL. This previously happened to work because the two
flags happened to have the same values and every includer of
minidump_cpu_amd64.h also happened to previously include
minidump_cpu_x86.h.

Change-Id: If8b422d3623936f4a0b57a4cf6dac4f348daa024
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4480251
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-04-28 18:33:16 +00:00
Leonard Grey
57bed07ad4 Mac: update arch_utilities for macOS 13
The NXArch* family is deprecated in macOS 13. This change:
 - Uses the replacements where available
 - Silences deprecation warnings otherwise
 - Removes the Linux cross-compile shims in favor of having completely
 separate implementations for Mac and non-Mac. The logic of the Linux
 versions uses the same prepopulated data as before, but they no longer
 use NXArchInfo.

clang diagnostic disables are necessary due to https://crbug.com/1406057

Bug: chromium:1420654, google-breakpad:880, b/257505171
Change-Id: Iad777915a5a058551cfb3a7d3cf681cce180dfea
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4437109
Reviewed-by: Mark Mentovai <mark@chromium.org>
2023-04-27 16:39:19 +00:00
Leonard Grey
652e7dac80 Update Mac Headers
These are reimported from Apple's Github source drops, see exact
provenance in README. Most were imported as is, some were edited
to match previous versions, and as noted below

- Added arm headers where needed
- Removed (now) unused `/mach/i386/vm_param.h`
- Removed availability annotations
- Removed `__kernel_ptr_semantics`
- Added `defined(__aarch64__)` to all arm64 define guards

Bug: chromium:1420654, google-breakpad:880, b/257505171
Change-Id: I17bd03fa871a8f1dc4285daafa3d7b26c2186e2b
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4482294
Reviewed-by: Mark Mentovai <mark@chromium.org>
2023-04-27 14:56:41 +00:00
Peter Boström
7b981b2135 Replace unsigned int with size_t for ModuleSerializer
This is a speculative fix for a memory bug where our symbol files are
looking like they've grown enough that serializing them will outgrow
UINT_MAX. Before this change a size_t is implicitly cast to a size_t in
unsigned int, allocate a buffer of that size and then continue to write
module data out of bounds.

I have not been able to reproduce the OOB write locally as the original
uploaded symbol data is gone, but I have been able to reproduce builds
where, if we enable inline frames and CFI dumping, the size grows to
3.6GB when serializing it, which is close enough to 4.2GB that the
wrapping theory seems reasonable on another board or build.

No effort is made here to prevent wrapping behavior on 32-bit systems.

Bug: b/237242489, chromium:1410232
Change-Id: I3d7ec03c51c298f10df3d5b1e5306433875c7919
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4477821
Reviewed-by: Leonard Grey <lgrey@chromium.org>
Reviewed-by: Mark Mentovai <mark@chromium.org>
2023-04-26 20:22:23 +00:00
Ben Hamilton
bfde407de5 [dump_syms] Relax name matching for marking symbols as multiple
Previously, the logic to mark a symbol as "multiple" would always fire
for C++ symbols for Apple `.dSYM`s built with `-gmlt`.

This was because for a C++ symbol like `void foo::bar::Baz()`, the
DWARF data would contain the truncated function name `Baz`, but the
STABS would contain the fully-qualified name `void foo::bar::Baz()`.

This CL relaxes the name matching to not mark as multiple:

1) Symbols which were missing names entirely in the DWARF (e.g, "<name omitted">)`
2) Symbols whose fully-qualified name includes the truncated name as a substring

Bug: https://bugs.chromium.org/p/google-breakpad/issues/detail?id=883
Change-Id: I26ded7ca84d964aa4a73da19e4bdd7e686e2c998
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4470047
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-04-24 19:59:30 +00:00
Ben Hamilton
f548d75c9f [dump_syms/Mac] New -x option to prefer extern names when there's a mismatch
When built with -gmlt, .dSYMs are (by design) missing the
`DW_AT_linkage_name` which Breakpad uses to fill out the
(name-mangled) function names.

Thankfully, the .dSYM contains both the old-school LC_SYMTAB command
containing the STABS-format symbols (which include the fully-qualified
C++ symbol names we want, but no actual compilation unit data), as
well as the LC_SEGMENT_64 containing the __DWARF segment with the
minimal -gmlt debug information (which excludes the name-mangled C++
symbols).

Unfortunately, since the .dSYM's STABS does not define compilation
units, the usual path in `StabsReader` ignores all the fully-qualified
C++ symbol names for the functions:

bd9d94c708/src/common/stabs_reader.cc (100)

Fortunately, when built for macOS platforms (`HAVE_MACH_O_NLIST_H`),
`StabsReader` supports storing all the STABS-format symbols as
`Extern`s, regardless of whether or not they're in a compilation unit:

bd9d94c708/src/common/stabs_reader.cc (119)

Currently, when there's both a `Function` and an `Extern` with the same address, `Module` discards the `Extern`:

bd9d94c708/src/common/module.cc (161)

This CL adds a new `-x` option to the Mac `dump_syms` which prefers
the Extern function name if there's a mismatch.

Bug: https://bugs.chromium.org/p/google-breakpad/issues/detail?id=883
Change-Id: I0d32adc64fbf567600b0a5ca63c71c422b7f0f8c
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4453650
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-04-24 16:46:57 +00:00
Ziad Youssef
16cee17997 Fix alignment of the brief output of minidump_stackwalk
Bug: 1435239
Change-Id: I4ea6cbe89d5ef0907f7e07c454e4533995996521
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4459351
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-04-24 15:41:17 +00:00
Yuki Wang
bd9d94c708 Set O_NONBLOCK for opening file to prevent hanging when file unavailable.
Bug: 277976345
Change-Id: Iddf55d8e172f98c76ae7167f609fb53c4c60fa48
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4437089
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-04-17 21:23:19 +00:00
Thomas Gales
b1775c56b2 Convert RISC-V numeric identifiers to strings
Printing the register values as part of the stack trace relies on the
CPU architecture being "riscv" or "riscv64" rather than the numeric
identifiers (0x8005 and 0x8006, respectively).

Fixed: 1432306

Test: Run `minidump_stackwalk` on a RISC-V minidump
Change-Id: I0009da687438d51047e2ee39ffa1c50d78798caa
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4416399
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
2023-04-11 21:51:18 +00:00
Alex Gough
f6e42357d4 Add maxsize for xstate areas
Breakpad skips the xstate area in x64 contexts but allowed this area
to be of unconstrained size. This hits problems if the size is greater
than Chrome's maximum allocation size, so we change to skipping a
maximum size. The maximum is chosen to allow the full set of states
today, plus some slack for the future:

Based on Intel x64 manual 13.5 XSAVE-MANAGED STATE

* => further bytes might be reserved

| Size | Region           |
|  576 | Legacy + header  |
|  384 | AVX State        |
|   80 | MPX State        |
| 1600 | AVX-512 State    |
|   72*| PT State         |
|    8 | pkru state       |
|    8 | pasid state      |
|   16 | CET state        |
|    8 | HDC State        |
|   96?| uintr state      |
|  808*| lbr state        |
|    8 | hwp state        |
|   16 | amx state        |

== 3680 so jump up a bit for the future to 2**12.

Bug:1425631
Change-Id: Ie08555651977cdbfa1c351c661118f13238213c4
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4379497
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
2023-04-01 01:52:18 +00:00
Thomas Gales
4d8bb33976 Add RISC-V register names
RISC-V register names are needed in order to load DWARF call frame
information.

Bug: fuchsia:124084
Change-Id: I2791b3a38ea35ddc2bb293f60f75dcc86338e354
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4376827
Reviewed-by: Mike Frysinger <vapier@chromium.org>
2023-03-29 04:37:32 +00:00
Thomas Gales
b0dc1f3529 Add EM_RISCV as recognized value for ELF e_machine
`dump_syms` fails to write symbol file without knowing how to convert
the ELF `e_machine` field to a string.

Use "riscv" as the value because ELF `e_machine` does not distinguish
between 32 bit and 64 bit RISC-V.

Test: run `dump_syms` on the libc++ that's shipped with the Clang
toolchain, or any other riscv binary: `./dump_syms -r -n libc++.so -o
Fuchsia <clang_path>/lib/riscv64-unknown-fuchsia/libc++.so.2.0`
Bug: fuchsia:124084
Change-Id: Ic04db96ec3d3d484350bdd0b90c9dfb70d7f7eb2
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4376828
Reviewed-by: Mike Frysinger <vapier@chromium.org>
2023-03-28 20:32:38 +00:00