[Lldb-commits] [PATCH] Prevent LLGS from crashing when exiting - make NativeProcessLinux to wait until ThreadStateCoordinator is fully stopped before entering ~NativeProcessLinux.

Oleksiy Vyalov ovyalov at google.com
Tue Feb 17 10:44:18 PST 2015

On Tue, Feb 17, 2015 at 10:01 AM, Tamas Berghammer <tberghammer at google.com>

> As far as I know NativeProcessLinux is still fully functional during the
> execution of it's destructor. The only difference is that the members in
> GDBRemoteCommunicationServerLLGS defined after the NativeProcessLinux smart
> pointer are already destructed. If this ordering is the problem then it can
> be solved with changing the order of the member declarations inside
> GDBRemoteCommunicationServerLLGS.
Yes, an instance is functional when its destructor is being called but
there some limitations:

   - You may hit undefined behavior if virtual function are called when
   destruction is in progress -
   http://www.artima.com/cppsource/nevercall.html, i.e. if some virtual
   function of NativeProcessLinux are called by TSC when ~NativeProcessLinux
   is in progress - it might be a problem.
   - NativeProcessLinux is derived from NativeProcessProtocol which in its
   turn holds list of threads - "std::vector<NativeThreadProtocolSP>
   m_threads;". Each instance of NativeThreadProtocol maintains a weak pointer
   to its process -
   NativeThreadProtocol::GetProcess gives you a locked NativeProcessProtocolSP
   (or (NativeProcessProtocolSP(nullptr) if shared_ptr is no longer alive)).

           Here the situation which I faced when I added just
m_coordinator_thread.Join (nullptr); without Terminate call:

   - ~NativeProcessLinux is calling StopMonitor
      - NativeThreadLinux::SetRunning is called from TSC thread -
      - NativeThreadLinux::SetRunning is trying to get process shared_ptr
      via GetProcess()
      - Since GDBRemoteCommunicationServerLLGS
      holds lldb_private::NativeProcessProtocolSP m_debugged_process_sp; and
      we're inside of ~NativeProcessLinux - so, shared_ptr is no longer valid
      and GetProcess() returns NativeProcessProtocolSP(nullptr)
      - SIGSEGV when trying to call GetProcess()->GetWatchpointMap();

> I am confused if the introduction of the Terminate method made any
> difference.
  I assume we may put more safety nets
into NativeThreadProtocol::GetProcess - add more assertations to check
value of shared_ptr or check return value of GetProcess for nullptr. But to
be sure that NativeProcessLinux is still accessible via shared_ptr and
virtual methods can be safely executed on NativeProcessLinux I decided to
introduce Terminate method.

> http://reviews.llvm.org/D7692
>   http://reviews.llvm.org/settings/panel/emailpreferences/

Oleksiy Vyalov | Software Engineer | ovyalov at google.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150217/609c3b36/attachment.html>

More information about the lldb-commits mailing list