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