summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/Windows/DebuggerThread.cpp
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2014-11-11 00:00:14 +0000
committerZachary Turner <zturner@google.com>2014-11-11 00:00:14 +0000
commitdcd80377f3f8af50d844241cad1f9f710358ae96 (patch)
treede7c875883ccc6c4fc4dbf2d4eed1041989097b6 /lldb/source/Plugins/Process/Windows/DebuggerThread.cpp
parent6cc5f73e38e3166c60b8591f13e14aa8e5bd423f (diff)
downloadbcm5719-llvm-dcd80377f3f8af50d844241cad1f9f710358ae96.tar.gz
bcm5719-llvm-dcd80377f3f8af50d844241cad1f9f710358ae96.zip
[ProcessWindows] Implement breakpoint stop / resume on Windows.
This patch implements basic support for stopping at breakpoints and resuming later. While a breakpoint is stopped at, LLDB will cease to process events in the debug loop, effectively suspending the process, and then resume later when ProcessWindows::DoResume is called. As a side effect, this also correctly handles the loader breakpoint (i.e. the initial stop) so that LLDB goes through the correct state sequence during the initial process launch. llvm-svn: 221642
Diffstat (limited to 'lldb/source/Plugins/Process/Windows/DebuggerThread.cpp')
-rw-r--r--lldb/source/Plugins/Process/Windows/DebuggerThread.cpp24
1 files changed, 21 insertions, 3 deletions
diff --git a/lldb/source/Plugins/Process/Windows/DebuggerThread.cpp b/lldb/source/Plugins/Process/Windows/DebuggerThread.cpp
index f0e27b08607..00e08490dc2 100644
--- a/lldb/source/Plugins/Process/Windows/DebuggerThread.cpp
+++ b/lldb/source/Plugins/Process/Windows/DebuggerThread.cpp
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "DebuggerThread.h"
+#include "ExceptionRecord.h"
#include "IDebugDelegate.h"
#include "ProcessMessages.h"
@@ -98,6 +99,12 @@ DebuggerThread::DebuggerThreadRoutine(const ProcessLaunchInfo &launch_info)
}
void
+DebuggerThread::ContinueAsyncException(ExceptionResult result)
+{
+ m_exception.SetValue(result, eBroadcastAlways);
+}
+
+void
DebuggerThread::DebugLoop()
{
DEBUG_EVENT dbe = {0};
@@ -108,8 +115,17 @@ DebuggerThread::DebugLoop()
switch (dbe.dwDebugEventCode)
{
case EXCEPTION_DEBUG_EVENT:
- continue_status = HandleExceptionEvent(dbe.u.Exception, dbe.dwThreadId);
+ {
+ ExceptionResult status = HandleExceptionEvent(dbe.u.Exception, dbe.dwThreadId);
+ m_exception.SetValue(status, eBroadcastNever);
+ m_exception.WaitForValueNotEqualTo(ExceptionResult::WillHandle, status);
+
+ if (status == ExceptionResult::Handled)
+ continue_status = DBG_CONTINUE;
+ else if (status == ExceptionResult::NotHandled)
+ continue_status = DBG_EXCEPTION_NOT_HANDLED;
break;
+ }
case CREATE_THREAD_DEBUG_EVENT:
continue_status = HandleCreateThreadEvent(dbe.u.CreateThread, dbe.dwThreadId);
break;
@@ -143,10 +159,12 @@ DebuggerThread::DebugLoop()
}
}
-DWORD
+ExceptionResult
DebuggerThread::HandleExceptionEvent(const EXCEPTION_DEBUG_INFO &info, DWORD thread_id)
{
- return DBG_CONTINUE;
+ bool first_chance = (info.dwFirstChance != 0);
+ ProcessMessageException message(m_process, ExceptionRecord(info.ExceptionRecord), first_chance);
+ return m_debug_delegate->OnDebugException(message);
}
DWORD
OpenPOWER on IntegriCloud