From 25c638c20b7a6479c5630b99b55937e4a0aee680 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sat, 25 Jul 2015 17:17:18 -0400 Subject: [PATCH] Debugger: Adjust ThreadHandler. - SetBreakpointAndRun() now takes an additional argument indicating if this invocation is for a fresh run of a team or not, as continuing the thread's execution needs to be done differently in the two cases. --- src/apps/debugger/controllers/ThreadHandler.cpp | 10 ++++++++-- src/apps/debugger/controllers/ThreadHandler.h | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/apps/debugger/controllers/ThreadHandler.cpp b/src/apps/debugger/controllers/ThreadHandler.cpp index 838b8ffd59..361f6575c5 100644 --- a/src/apps/debugger/controllers/ThreadHandler.cpp +++ b/src/apps/debugger/controllers/ThreadHandler.cpp @@ -119,16 +119,22 @@ ThreadHandler::Init() status_t -ThreadHandler::SetBreakpointAndRun(target_addr_t address) +ThreadHandler::SetBreakpointAndRun(target_addr_t address, bool initialStart) { status_t error = _InstallTemporaryBreakpoint(address); if (error != B_OK) return error; fPreviousInstructionPointer = 0; - resume_thread(ThreadID()); + // when the program is first run, the initial thread is not yet under + // the control of the debug nub, so it needs to be resumed rather than + // continued. + if (initialStart) { + resume_thread(ThreadID()); // TODO: This should probably better be a DebuggerInterface method, // but this method is used only when debugging a local team anyway. + } else + fDebuggerInterface->ContinueThread(ThreadID()); // Pretend "step out" mode, so that the temporary breakpoint hit will not // be ignored. fStepMode = STEP_OUT; diff --git a/src/apps/debugger/controllers/ThreadHandler.h b/src/apps/debugger/controllers/ThreadHandler.h index 432eac1e9f..b0b4cdd7c1 100644 --- a/src/apps/debugger/controllers/ThreadHandler.h +++ b/src/apps/debugger/controllers/ThreadHandler.h @@ -39,7 +39,8 @@ public: thread_id ThreadID() const { return fThread->ID(); } Thread* GetThread() const { return fThread; } - status_t SetBreakpointAndRun(target_addr_t address); + status_t SetBreakpointAndRun(target_addr_t address, + bool initialStart = true); // team lock held // All Handle*() methods are invoked in team debugger thread,