[Lldb-commits] [PATCH] D62183: [Windows] Fix race condition between state changes
Martin Andersson via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Tue May 21 03:10:17 PDT 2019
martin created this revision.
martin added a reviewer: zturner.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.
If the process is resumed before the state is changed to "running" there is a possibility (when single stepping) that the debugger stops and changes the state to "stopped" before it is first changed to "running". This causes the process to ignore the stop event (since the state did not change) which in turn leads the DebuggerThread to wait indefinitely for the exception predicate in HandleExceptionEvent.
Repository:
rLLDB LLDB
https://reviews.llvm.org/D62183
Files:
source/Plugins/Process/Windows/Common/ProcessWindows.cpp
Index: source/Plugins/Process/Windows/Common/ProcessWindows.cpp
===================================================================
--- source/Plugins/Process/Windows/Common/ProcessWindows.cpp
+++ source/Plugins/Process/Windows/Common/ProcessWindows.cpp
@@ -359,16 +359,6 @@
m_session_data->m_debugger->GetProcess().GetProcessId(),
GetPrivateState());
- ExceptionRecordSP active_exception =
- m_session_data->m_debugger->GetActiveException().lock();
- if (active_exception) {
- // Resume the process and continue processing debug events. Mask the
- // exception so that from the process's view, there is no indication that
- // anything happened.
- m_session_data->m_debugger->ContinueAsyncException(
- ExceptionResult::MaskException);
- }
-
LLDB_LOG(log, "resuming {0} threads.", m_thread_list.GetSize());
bool failed = false;
@@ -387,10 +377,19 @@
if (failed) {
error.SetErrorString("ProcessWindows::DoResume failed");
- return error;
} else {
SetPrivateState(eStateRunning);
}
+
+ ExceptionRecordSP active_exception =
+ m_session_data->m_debugger->GetActiveException().lock();
+ if (active_exception) {
+ // Resume the process and continue processing debug events. Mask the
+ // exception so that from the process's view, there is no indication that
+ // anything happened.
+ m_session_data->m_debugger->ContinueAsyncException(
+ ExceptionResult::MaskException);
+ }
} else {
LLDB_LOG(log, "error: process {0} is in state {1}. Returning...",
m_session_data->m_debugger->GetProcess().GetProcessId(),
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62183.200443.patch
Type: text/x-patch
Size: 1695 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20190521/4168afe8/attachment-0001.bin>
More information about the lldb-commits
mailing list