Index: include/lldb/Host/common/NativeProcessProtocol.h =================================================================== --- include/lldb/Host/common/NativeProcessProtocol.h +++ include/lldb/Host/common/NativeProcessProtocol.h @@ -283,6 +283,10 @@ bool UnregisterNativeDelegate (NativeDelegate &native_delegate); + // Called before termination of NativeProcessProtocol's instance. + virtual void + Terminate (); + protected: lldb::pid_t m_pid; Index: source/Host/common/NativeProcessProtocol.cpp =================================================================== --- source/Host/common/NativeProcessProtocol.cpp +++ source/Host/common/NativeProcessProtocol.cpp @@ -435,3 +435,9 @@ { // Default implementation does nothing. } + +void +NativeProcessProtocol::Terminate () +{ + // Default implementation does nothing. +} Index: source/Plugins/Process/Linux/NativeProcessLinux.h =================================================================== --- source/Plugins/Process/Linux/NativeProcessLinux.h +++ source/Plugins/Process/Linux/NativeProcessLinux.h @@ -62,12 +62,6 @@ NativeProcessProtocolSP &native_process_sp); // --------------------------------------------------------------------- - // Public Instance Methods - // --------------------------------------------------------------------- - - ~NativeProcessLinux() override; - - // --------------------------------------------------------------------- // NativeProcessProtocol Interface // --------------------------------------------------------------------- Error @@ -118,6 +112,9 @@ void DoStopIDBumped (uint32_t newBumpId) override; + void + Terminate () override; + // --------------------------------------------------------------------- // Interface used by NativeRegisterContext-derived classes. // --------------------------------------------------------------------- Index: source/Plugins/Process/Linux/NativeProcessLinux.cpp =================================================================== --- source/Plugins/Process/Linux/NativeProcessLinux.cpp +++ source/Plugins/Process/Linux/NativeProcessLinux.cpp @@ -1453,7 +1453,8 @@ } } -NativeProcessLinux::~NativeProcessLinux() +void +NativeProcessLinux::Terminate () { StopMonitor(); } @@ -3637,6 +3638,7 @@ // Tell the coordinator we're done. This will cause the coordinator // run loop thread to exit when the processing queue hits this message. m_coordinator_up->StopCoordinator (); + m_coordinator_thread.Join (nullptr); } bool Index: source/Plugins/Process/Linux/NativeThreadLinux.cpp =================================================================== --- source/Plugins/Process/Linux/NativeThreadLinux.cpp +++ source/Plugins/Process/Linux/NativeThreadLinux.cpp @@ -270,13 +270,17 @@ // then this is a new thread. So set all existing watchpoints. if (m_watchpoint_index_map.empty()) { - const auto &watchpoint_map = GetProcess()->GetWatchpointMap(); - if (watchpoint_map.empty()) return; - GetRegisterContext()->ClearAllHardwareWatchpoints(); - for (const auto &pair : watchpoint_map) + const auto process_sp = GetProcess(); + if (process_sp) { - const auto& wp = pair.second; - SetWatchpoint(wp.m_addr, wp.m_size, wp.m_watch_flags, wp.m_hardware); + const auto &watchpoint_map = process_sp->GetWatchpointMap(); + if (watchpoint_map.empty()) return; + GetRegisterContext()->ClearAllHardwareWatchpoints(); + for (const auto &pair : watchpoint_map) + { + const auto& wp = pair.second; + SetWatchpoint(wp.m_addr, wp.m_size, wp.m_watch_flags, wp.m_hardware); + } } } } Index: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp =================================================================== --- source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp +++ source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp @@ -99,6 +99,13 @@ //---------------------------------------------------------------------- GDBRemoteCommunicationServerLLGS::~GDBRemoteCommunicationServerLLGS() { + Mutex::Locker locker (m_debugged_process_mutex); + + if (m_debugged_process_sp) + { + m_debugged_process_sp->Terminate (); + m_debugged_process_sp.reset (); + } } void