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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits