summaryrefslogtreecommitdiff
path: root/lldb
diff options
context:
space:
mode:
authorLeonard Mosescu <mosescu@google.com>2019-01-07 17:55:42 +0000
committerLeonard Mosescu <mosescu@google.com>2019-01-07 17:55:42 +0000
commit88f7e67d8a088d0e00186fb84259616c01a61217 (patch)
tree23872982ef752b4c68164ad11a2621a5421ed158 /lldb
parent3dee5535df0fd4a35df242e964f0055b1d672a6b (diff)
Use the minidump exception record if present
If the minidump contains a saved exception record use it automatically. Differential Revision: https://reviews.llvm.org/D56293
Diffstat (limited to 'lldb')
-rw-r--r--lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.cpp40
-rw-r--r--lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.dmpbin0 -> 102370 bytes
-rw-r--r--lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.lldbinit2
-rw-r--r--lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.pdbbin0 -> 102400 bytes
-rw-r--r--lldb/lit/Minidump/Windows/Sigsegv/sigsegv.test13
-rw-r--r--lldb/source/Plugins/Process/minidump/MinidumpParser.cpp10
-rw-r--r--lldb/source/Plugins/Process/minidump/MinidumpParser.h3
-rw-r--r--lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp30
8 files changed, 82 insertions, 16 deletions
diff --git a/lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.cpp b/lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.cpp
new file mode 100644
index 00000000000..6bf78b5dc43
--- /dev/null
+++ b/lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.cpp
@@ -0,0 +1,40 @@
+
+// nodefaultlib build: cl -Zi sigsegv.cpp /link /nodefaultlib
+
+#ifdef USE_CRT
+#include <stdio.h>
+#else
+int main();
+extern "C"
+{
+ int _fltused;
+ void mainCRTStartup() { main(); }
+ void printf(const char*, ...) {}
+}
+#endif
+
+void crash(bool crash_self)
+{
+ printf("Before...\n");
+ if(crash_self)
+ {
+ printf("Crashing in 3, 2, 1 ...\n");
+ *(volatile int*)nullptr = 0;
+ }
+ printf("After...\n");
+}
+
+int foo(int x, float y, const char* msg)
+{
+ bool flag = x > y;
+ if(flag)
+ printf("x = %d, y = %f, msg = %s\n", x, y, msg);
+ crash(flag);
+ return x << 1;
+}
+
+int main()
+{
+ foo(10, 3.14, "testing");
+}
+
diff --git a/lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.dmp b/lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.dmp
new file mode 100644
index 00000000000..c918a6c64e5
--- /dev/null
+++ b/lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.dmp
Binary files differ
diff --git a/lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.lldbinit b/lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.lldbinit
new file mode 100644
index 00000000000..dff1f1a295e
--- /dev/null
+++ b/lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.lldbinit
@@ -0,0 +1,2 @@
+bt all
+dis
diff --git a/lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.pdb b/lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.pdb
new file mode 100644
index 00000000000..d60f9cffdda
--- /dev/null
+++ b/lldb/lit/Minidump/Windows/Sigsegv/Inputs/sigsegv.pdb
Binary files differ
diff --git a/lldb/lit/Minidump/Windows/Sigsegv/sigsegv.test b/lldb/lit/Minidump/Windows/Sigsegv/sigsegv.test
new file mode 100644
index 00000000000..dfa98c56656
--- /dev/null
+++ b/lldb/lit/Minidump/Windows/Sigsegv/sigsegv.test
@@ -0,0 +1,13 @@
+// RUN: cd %p/Inputs
+// RUN: env LLDB_USE_NATIVE_PDB_READER=1 \
+// RUN: %lldb -c sigsegv.dmp -s sigsegv.lldbinit | FileCheck %s
+
+CHECK: * thread #1, stop reason = Exception 0xc0000005 encountered at address 0x7ff7a13110d9
+CHECK: * frame #0: 0x00007ff7a13110d9 sigsegv.exe
+
+CHECK: -> 0x7ff7a13110d9: movl $0x0, 0x0
+CHECK: 0x7ff7a13110e4: leaq 0x1f45(%rip), %rcx
+CHECK: 0x7ff7a13110eb: callq 0x7ff7a1311019
+CHECK: 0x7ff7a13110f0: addq $0x28, %rsp
+CHECK: 0x7ff7a13110f4: retq
+CHECK: 0x7ff7a13110f5: int3
diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp
index 387852eaa90..5372d32a0df 100644
--- a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp
+++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp
@@ -107,11 +107,15 @@ llvm::ArrayRef<MinidumpThread> MinidumpParser::GetThreads() {
}
llvm::ArrayRef<uint8_t>
-MinidumpParser::GetThreadContext(const MinidumpThread &td) {
- if (td.thread_context.rva + td.thread_context.data_size > GetData().size())
+MinidumpParser::GetThreadContext(const MinidumpLocationDescriptor &location) {
+ if (location.rva + location.data_size > GetData().size())
return {};
+ return GetData().slice(location.rva, location.data_size);
+}
- return GetData().slice(td.thread_context.rva, td.thread_context.data_size);
+llvm::ArrayRef<uint8_t>
+MinidumpParser::GetThreadContext(const MinidumpThread &td) {
+ return GetThreadContext(td.thread_context);
}
llvm::ArrayRef<uint8_t>
diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.h b/lldb/source/Plugins/Process/minidump/MinidumpParser.h
index 3f93f66e6c3..07ea6aa908f 100644
--- a/lldb/source/Plugins/Process/minidump/MinidumpParser.h
+++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.h
@@ -58,6 +58,9 @@ public:
llvm::ArrayRef<MinidumpThread> GetThreads();
+ llvm::ArrayRef<uint8_t>
+ GetThreadContext(const MinidumpLocationDescriptor &location);
+
llvm::ArrayRef<uint8_t> GetThreadContext(const MinidumpThread &td);
llvm::ArrayRef<uint8_t> GetThreadContextWow64(const MinidumpThread &td);
diff --git a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
index 7c030811843..c5cca7ea62c 100644
--- a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
+++ b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
@@ -34,6 +34,7 @@
#include "llvm/Support/Threading.h"
#include "Plugins/Process/Utility/StopInfoMachException.h"
+
// C includes
// C++ includes
@@ -80,7 +81,7 @@ public:
section_sp, module->base_of_image);
}
- ObjectFile *GetObjectFile() override { return nullptr; }
+ObjectFile *GetObjectFile() override { return nullptr; }
SectionList *GetSectionList() override {
return Module::GetUnifiedSectionList();
@@ -305,19 +306,22 @@ void ProcessMinidump::Clear() { Process::m_thread_list.Clear(); }
bool ProcessMinidump::UpdateThreadList(ThreadList &old_thread_list,
ThreadList &new_thread_list) {
- uint32_t num_threads = 0;
- if (m_thread_list.size() > 0)
- num_threads = m_thread_list.size();
+ for (const MinidumpThread& thread : m_thread_list) {
+ MinidumpLocationDescriptor context_location = thread.thread_context;
+
+ // If the minidump contains an exception context, use it
+ if (m_active_exception != nullptr &&
+ m_active_exception->thread_id == thread.thread_id) {
+ context_location = m_active_exception->thread_context;
+ }
- for (lldb::tid_t tid = 0; tid < num_threads; ++tid) {
llvm::ArrayRef<uint8_t> context;
if (!m_is_wow64)
- context = m_minidump_parser.GetThreadContext(m_thread_list[tid]);
+ context = m_minidump_parser.GetThreadContext(context_location);
else
- context = m_minidump_parser.GetThreadContextWow64(m_thread_list[tid]);
+ context = m_minidump_parser.GetThreadContextWow64(thread);
- lldb::ThreadSP thread_sp(
- new ThreadMinidump(*this, m_thread_list[tid], context));
+ lldb::ThreadSP thread_sp(new ThreadMinidump(*this, thread, context));
new_thread_list.AddThread(thread_sp);
}
return new_thread_list.GetSize(false) > 0;
@@ -549,9 +553,9 @@ public:
APPEND_OPT(m_dump_linux_all);
m_option_group.Finalize();
}
-
+
~CommandObjectProcessMinidumpDump() {}
-
+
Options *GetOptions() override { return &m_option_group; }
bool DoExecute(Args &command, CommandReturnObject &result) override {
@@ -563,7 +567,7 @@ public:
return false;
}
SetDefaultOptionsIfNoneAreSet();
-
+
ProcessMinidump *process = static_cast<ProcessMinidump *>(
m_interpreter.GetExecutionContext().GetProcessPtr());
result.SetStatus(eReturnStatusSuccessFinishResult);
@@ -635,7 +639,7 @@ public:
LoadSubCommand("dump",
CommandObjectSP(new CommandObjectProcessMinidumpDump(interpreter)));
}
-
+
~CommandObjectMultiwordProcessMinidump() {}
};