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()
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(),
--- /dev/null
+--- !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
+...
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();
Status ProcessMinidump::DoDestroy() { return Status(); }
void ProcessMinidump::RefreshStateAfterStop() {
+
if (!m_active_exception)
return;
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,