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,