JosephTremoulet created this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.

Set the UnixSignals object when isOSLinux is true, and force a SIGSTOP
if there's no other signal when loading a core dump (the same as
ProcessElfCore::DoLoadCore does) since the loading process reports a stop.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D68096

Files:
  lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
  lldb/source/Plugins/Process/minidump/ProcessMinidump.h

Index: lldb/source/Plugins/Process/minidump/ProcessMinidump.h
===================================================================
--- lldb/source/Plugins/Process/minidump/ProcessMinidump.h
+++ lldb/source/Plugins/Process/minidump/ProcessMinidump.h
@@ -109,6 +109,8 @@
   lldb::DataBufferSP m_core_data;
   llvm::ArrayRef<minidump::Thread> m_thread_list;
   const MinidumpExceptionStream *m_active_exception;
+  uint32_t m_synthetic_exception_signal;
+  lldb::tid_t m_synthetic_exception_thread_id;
   lldb::CommandObjectSP m_command_sp;
   bool m_is_wow64;
 };
Index: lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
===================================================================
--- lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
+++ lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
@@ -163,7 +163,8 @@
                                  const FileSpec &core_file,
                                  DataBufferSP core_data)
     : Process(target_sp, listener_sp), m_core_file(core_file),
-      m_core_data(std::move(core_data)), m_is_wow64(false) {}
+      m_core_data(std::move(core_data)),
+      m_synthetic_exception_signal(0), m_is_wow64(false) {}
 
 ProcessMinidump::~ProcessMinidump() {
   Clear();
@@ -215,6 +216,25 @@
 
   m_thread_list = m_minidump_parser->GetThreads();
   m_active_exception = m_minidump_parser->GetExceptionStream();
+
+  if (arch.GetTriple().isOSLinux()) {
+
+    SetUnixSignals(UnixSignals::Create(GetArchitecture()));
+
+    if (!m_thread_list.empty() &&
+        (!m_active_exception ||
+         !m_active_exception->exception_record.exception_code)) {
+      // No active signal, but we're going to process a stop event
+      // upon loading the core, so force a SIGSTOP on the first
+      // thread.
+      m_synthetic_exception_signal =
+        GetUnixSignals()->GetSignalNumberFromName("SIGSTOP");
+
+      m_synthetic_exception_thread_id =
+        m_thread_list.front().ThreadId;
+    }
+  }
+
   ReadModuleList();
 
   llvm::Optional<lldb::pid_t> pid = m_minidump_parser->GetPid();
@@ -234,24 +254,40 @@
 Status ProcessMinidump::DoDestroy() { return Status(); }
 
 void ProcessMinidump::RefreshStateAfterStop() {
-  if (!m_active_exception)
-    return;
 
-  if (m_active_exception->exception_record.exception_code ==
-      MinidumpException::DumpRequested) {
-    return;
+  lldb::tid_t exception_thread_id;
+
+  if (m_synthetic_exception_signal) {
+    exception_thread_id = m_synthetic_exception_thread_id;
+  } else {
+    if (!m_active_exception)
+      return;
+
+    if (m_active_exception->exception_record.exception_code ==
+        MinidumpException::DumpRequested) {
+      return;
+    }
+
+    exception_thread_id = m_active_exception->thread_id;
   }
 
   lldb::StopInfoSP stop_info;
   lldb::ThreadSP stop_thread;
 
-  Process::m_thread_list.SetSelectedThreadByID(m_active_exception->thread_id);
+  Process::m_thread_list.SetSelectedThreadByID(exception_thread_id);
   stop_thread = Process::m_thread_list.GetSelectedThread();
   ArchSpec arch = GetArchitecture();
 
   if (arch.GetTriple().getOS() == llvm::Triple::Linux) {
+    uint32_t signo;
+    if (m_synthetic_exception_signal) {
+      signo = m_synthetic_exception_signal;
+      m_synthetic_exception_signal = 0;
+    } else {
+      signo = m_active_exception->exception_record.exception_code;
+    }
     stop_info = StopInfo::CreateStopReasonWithSignal(
-        *stop_thread, m_active_exception->exception_record.exception_code);
+        *stop_thread, signo);
   } else if (arch.GetTriple().getVendor() == llvm::Triple::Apple) {
     stop_info = StopInfoMachException::CreateStopReasonWithMachException(
         *stop_thread, m_active_exception->exception_record.exception_code, 2,
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to