ProcessMinidump: Suppress reporting stop for signal '0'

Summary:
The minidump exception stream can report an exception record with
signal 0.  If we try to create a stop reason with signal zero, processing
of the stop event won't find anything, and the debugger will hang.
So, simply early-out of RefreshStateAfterStop in this case.

Also set the UnixSignals object in DoLoadCore as is done for
ProcessElfCore.

Reviewers: labath, clayborg, jfb

Reviewed By: labath, clayborg

Subscribers: dexonsmith, lldb-commits

Tags: #lldb

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

llvm-svn: 375244
This commit is contained in:
Joseph Tremoulet 2019-10-18 15:02:16 +00:00
parent d094d97d02
commit 77460d3888
3 changed files with 50 additions and 3 deletions

View File

@ -153,9 +153,9 @@ class MiniDumpNewTestCase(TestBase):
self.assertTrue(eip.IsValid())
self.assertEqual(pc, eip.GetValueAsUnsigned())
def test_snapshot_minidump(self):
def test_snapshot_minidump_dump_requested(self):
"""Test that if we load a snapshot minidump file (meaning the process
did not crash) there is no stop reason."""
did not crash) with exception code "DUMP_REQUESTED" there is no stop reason."""
# target create -c linux-x86_64_not_crashed.dmp
self.dbg.CreateTarget(None)
self.target = self.dbg.GetSelectedTarget()
@ -167,6 +167,17 @@ class MiniDumpNewTestCase(TestBase):
stop_description = thread.GetStopDescription(256)
self.assertEqual(stop_description, "")
def test_snapshot_minidump_null_exn_code(self):
"""Test that if we load a snapshot minidump file (meaning the process
did not crash) with exception code zero there is no stop reason."""
self.process_from_yaml("linux-x86_64_null_signal.yaml")
self.check_state()
self.assertEqual(self.process.GetNumThreads(), 1)
thread = self.process.GetThreadAtIndex(0)
self.assertEqual(thread.GetStopReason(), lldb.eStopReasonNone)
stop_description = thread.GetStopDescription(256)
self.assertEqual(stop_description, "")
def check_register_unsigned(self, set, name, expected):
reg_value = set.GetChildMemberWithName(name)
self.assertTrue(reg_value.IsValid(),

View File

@ -0,0 +1,25 @@
--- !minidump
Streams:
- Type: ThreadList
Threads:
- Thread Id: 0x00002177
Context: 0000
Stack:
Start of Memory Range: 0x00007FFE2F689000
Content: 00000000
- Type: Exception
Thread ID: 0x00002177
Exception Record:
Exception Code: 0x00000000
Exception Address: 0x0000000000400582
Thread Context: 0000
- Type: SystemInfo
Processor Arch: AMD64
Platform ID: Linux
- Type: LinuxProcStatus
Text: |
Name: busyloop
Umask: 0002
State: t (tracing stop)
Pid: 8567
...

View File

@ -219,6 +219,9 @@ Status ProcessMinidump::DoLoadCore() {
m_thread_list = m_minidump_parser->GetThreads();
m_active_exception = m_minidump_parser->GetExceptionStream();
SetUnixSignals(UnixSignals::Create(GetArchitecture()));
ReadModuleList();
llvm::Optional<lldb::pid_t> pid = m_minidump_parser->GetPid();
@ -238,6 +241,7 @@ uint32_t ProcessMinidump::GetPluginVersion() { return 1; }
Status ProcessMinidump::DoDestroy() { return Status(); }
void ProcessMinidump::RefreshStateAfterStop() {
if (!m_active_exception)
return;
@ -264,8 +268,15 @@ void ProcessMinidump::RefreshStateAfterStop() {
ArchSpec arch = GetArchitecture();
if (arch.GetTriple().getOS() == llvm::Triple::Linux) {
uint32_t signo = m_active_exception->ExceptionRecord.ExceptionCode;
if (signo == 0) {
// No stop.
return;
}
stop_info = StopInfo::CreateStopReasonWithSignal(
*stop_thread, m_active_exception->ExceptionRecord.ExceptionCode);
*stop_thread, signo);
} else if (arch.GetTriple().getVendor() == llvm::Triple::Apple) {
stop_info = StopInfoMachException::CreateStopReasonWithMachException(
*stop_thread, m_active_exception->ExceptionRecord.ExceptionCode, 2,