diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py b/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py --- a/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py +++ b/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py @@ -153,9 +153,9 @@ 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 @@ 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(), diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/linux-x86_64_null_signal.yaml b/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/linux-x86_64_null_signal.yaml new file mode 100644 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/linux-x86_64_null_signal.yaml @@ -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 +... diff --git a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp --- a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp +++ b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp @@ -219,6 +219,9 @@ m_thread_list = m_minidump_parser->GetThreads(); m_active_exception = m_minidump_parser->GetExceptionStream(); + + SetUnixSignals(UnixSignals::Create(GetArchitecture())); + ReadModuleList(); llvm::Optional pid = m_minidump_parser->GetPid(); @@ -238,6 +241,7 @@ Status ProcessMinidump::DoDestroy() { return Status(); } void ProcessMinidump::RefreshStateAfterStop() { + if (!m_active_exception) return; @@ -264,8 +268,15 @@ 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,