Re-commit "Introduce ObjectFileBreakpad"
authorPavel Labath <pavel@labath.sk>
Mon, 10 Dec 2018 17:16:38 +0000 (17:16 +0000)
committerPavel Labath <pavel@labath.sk>
Mon, 10 Dec 2018 17:16:38 +0000 (17:16 +0000)
commit1f6b247717c99678dceb06faf1e4c01b758f3e2e
tree9027235a5e8b5b3088e07a0f7d41de1c5e5b184e
parent9056f1116d2007e5d84f28704b932d5c9839c99a
Re-commit "Introduce ObjectFileBreakpad"

This re-commits r348592, which was reverted due to a failing test on
macos.

The issue was that I was passing a null pointer for the
"CreateMemoryInstance" callback when registering ObjectFileBreakpad,
which caused crashes when attemping to load modules from memory. The
correct thing to do is to pass a callback which always returns a null
pointer (as breakpad files are never loaded in inferior memory).

It turns out that there is only one test which exercises this code path,
and it's mac-only, so I've create a new test which should run everywhere
(except windows, as one cannot delete an executable which is being run).
Unfortunately, this test still fails on linux for other reasons, but at
least it gives us something to aim for.

The original commit message was:
This patch adds the scaffolding necessary for lldb to recognise symbol
files generated by breakpad. These (textual) files contain just enough
information to be able to produce a backtrace from a crash
dump. This information includes:
- UUID, architecture and name of the module
- line tables
- list of symbols
- unwind information

A minimal breakpad file could look like this:
MODULE Linux x86_64 0000000024B5D199F0F766FFFFFF5DC30 a.out
INFO CODE_ID 00000000B52499D1F0F766FFFFFF5DC3
FILE 0 /tmp/a.c
FUNC 1010 10 0 _start
1010 4 4 0
1014 5 5 0
1019 5 6 0
101e 2 7 0
PUBLIC 1010 0 _start
STACK CFI INIT 1010 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^
STACK CFI 1011 $rbp: .cfa -16 + ^ .cfa: $rsp 16 +
STACK CFI 1014 .cfa: $rbp 16 +

Even though this data would normally be considered "symbol" information,
in the current lldb infrastructure it is assumed every SymbolFile object
is backed by an ObjectFile instance. So, in order to better interoperate
with the rest of the code (particularly symbol vendors).

In this patch I just parse the breakpad header, which is enough to
populate the UUID and architecture fields of the ObjectFile interface.
The rough plan for followup patches is to expose the individual parts of
the breakpad file as ObjectFile "sections", which can then be used by
other parts of the codebase (SymbolFileBreakpad ?) to vend the necessary
information.

Reviewers: clayborg, zturner, lemo, amccarth

Subscribers: mgorny, fedor.sergeev, markmentovai, lldb-commits

Differential Revision: https://reviews.llvm.org/D55214

llvm-svn: 348773
20 files changed:
lldb/include/lldb/Symbol/ObjectFile.h
lldb/lit/Modules/Breakpad/Inputs/bad-module-id-1.syms [new file with mode: 0644]
lldb/lit/Modules/Breakpad/Inputs/bad-module-id-2.syms [new file with mode: 0644]
lldb/lit/Modules/Breakpad/Inputs/bad-module-id-3.syms [new file with mode: 0644]
lldb/lit/Modules/Breakpad/Inputs/identification-linux.syms [new file with mode: 0644]
lldb/lit/Modules/Breakpad/Inputs/identification-macosx.syms [new file with mode: 0644]
lldb/lit/Modules/Breakpad/Inputs/identification-windows.syms [new file with mode: 0644]
lldb/lit/Modules/Breakpad/breakpad-identification.test [new file with mode: 0644]
lldb/lit/Modules/Breakpad/lit.local.cfg [new file with mode: 0644]
lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/Makefile [new file with mode: 0644]
lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/TestDeletedExecutable.py [new file with mode: 0644]
lldb/packages/Python/lldbsuite/test/functionalities/deleted-executable/main.cpp [new file with mode: 0644]
lldb/source/API/SystemInitializerFull.cpp
lldb/source/Plugins/ObjectFile/Breakpad/CMakeLists.txt [new file with mode: 0644]
lldb/source/Plugins/ObjectFile/Breakpad/ObjectFileBreakpad.cpp [new file with mode: 0644]
lldb/source/Plugins/ObjectFile/Breakpad/ObjectFileBreakpad.h [new file with mode: 0644]
lldb/source/Plugins/ObjectFile/CMakeLists.txt
lldb/source/Symbol/ObjectFile.cpp
lldb/tools/lldb-test/SystemInitializerTest.cpp
lldb/tools/lldb-test/lldb-test.cpp