[Lldb-commits] [PATCH] D12980: Have a clean(er) shutdown when detaching from processes

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Fri Sep 18 13:10:47 PDT 2015


zturner created this revision.
zturner added a reviewer: amccarth.
zturner added a subscriber: lldb-commits.

Log file pre-patch:
1442531634.442000000 [0448/5520]: DoDetach called for process 25769804660 while state = 2673276.  Detaching...
1442531634.442000000 [0448/5520]: StopDebugging('false') called (inferior=2972).
1442531634.442000000 [0448/5520]: StopDebugging waiting for detach from process 2972 to complete.
1442531639.442000000 [0448/5520]: error: StopDebugging WaitForSingleObject(0x0000033C, 5000) returned 258
1442531639.442000000 [0448/5520]: Process::SetPrivateState (detached)

Log file post-patch:
    1442606676.750000000 [4a20/574c]: DoDetach called for process 25769804636 while state = 2673276.  Detaching...
    1442606676.750000000 [4a20/4c5c]: Process::lldb_private::Process::HandlePrivateEvent (pid = 19724) suppressing state running (old state running): should_broadcast == false
    1442606676.750000000 [4a20/574c]: StopDebugging('false') called (inferior=19724).
    1442606676.750000000 [4a20/4c5c]: Process::lldb_private::Process::WaitForEventsPrivate (timeout = 00000000, event_sp)...
    1442606676.750000000 [4a20/574c]: StopDebugging waiting for detach from process 19724 to complete.
    1442606676.750000000 [4a20/4a78]: Breakpoint exception is cue to detach from process 0x4d0c
    1442606676.750000000 [4a20/4a78]: WaitForDebugEvent loop completed, exiting.
    1442606676.750000000 [4a20/574c]: StopDebugging detach from process 19724 completed successfully.

http://reviews.llvm.org/D12980

Files:
  source/Plugins/Process/Windows/Live/DebuggerThread.cpp

Index: source/Plugins/Process/Windows/Live/DebuggerThread.cpp
===================================================================
--- source/Plugins/Process/Windows/Live/DebuggerThread.cpp
+++ source/Plugins/Process/Windows/Live/DebuggerThread.cpp
@@ -306,18 +306,28 @@
                 {
                     if (m_is_shutting_down)
                     {
+                        if (m_pid_to_detach != 0 && dbe.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT) {
+                            WINLOG_IFANY(WINDOWS_LOG_EVENT | WINDOWS_LOG_EXCEPTION | WINDOWS_LOG_PROCESS,
+                                         "Breakpoint exception is cue to detach from process 0x%x",
+                                         m_pid_to_detach);
+                            ::DebugActiveProcessStop(m_pid_to_detach);
+                            m_detached = true;
+                        }
+
                         // Don't perform any blocking operations while we're shutting down.  That will
                         // cause TerminateProcess -> WaitForSingleObject to time out.
                         continue_status = DBG_EXCEPTION_NOT_HANDLED;
-                        break;
                     }
+                    else
+                    {
+                        ExceptionResult status = HandleExceptionEvent(dbe.u.Exception, dbe.dwThreadId);
 
-                    ExceptionResult status = HandleExceptionEvent(dbe.u.Exception, dbe.dwThreadId);
+                        if (status == ExceptionResult::MaskException)
+                            continue_status = DBG_CONTINUE;
+                        else if (status == ExceptionResult::SendToApplication)
+                            continue_status = DBG_EXCEPTION_NOT_HANDLED;
+                    }
 
-                    if (status == ExceptionResult::MaskException)
-                        continue_status = DBG_CONTINUE;
-                    else if (status == ExceptionResult::SendToApplication)
-                        continue_status = DBG_EXCEPTION_NOT_HANDLED;
                     break;
                 }
                 case CREATE_THREAD_DEBUG_EVENT:
@@ -384,18 +394,6 @@
                  "HandleExceptionEvent encountered %s chance exception 0x%x on thread 0x%x",
                  first_chance ? "first" : "second", info.ExceptionRecord.ExceptionCode, thread_id);
 
-    if (m_pid_to_detach != 0 && m_active_exception->GetExceptionCode() == EXCEPTION_BREAKPOINT) {
-        WINLOG_IFANY(WINDOWS_LOG_EVENT | WINDOWS_LOG_EXCEPTION | WINDOWS_LOG_PROCESS,
-                     "Breakpoint exception is cue to detach from process 0x%x",
-                     m_pid_to_detach);
-        if (::DebugActiveProcessStop(m_pid_to_detach)) {
-            m_detached = true;
-            return ExceptionResult::MaskException;
-        } else {
-            WINLOG_IFANY(WINDOWS_LOG_PROCESS, "Failed to detach, treating as a regular breakpoint");
-        }
-    }
-
     ExceptionResult result = m_debug_delegate->OnDebugException(first_chance,
                                                                 *m_active_exception);
     m_exception_pred.SetValue(result, eBroadcastNever);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D12980.35127.patch
Type: text/x-patch
Size: 3180 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150918/83d56b09/attachment.bin>


More information about the lldb-commits mailing list