bool ThreadHandler::HandleDebuggerCall(DebuggerCallEvent* event) { BString message; fDebuggerInterface->ReadMemoryString(event->Message(), 1024, message); return _HandleThreadStopped(NULL, THREAD_STOPPED_DEBUGGER_CALL, message); }
bool ThreadHandler::HandleExceptionOccurred(ExceptionOccurredEvent* event) { char buffer[256]; get_debug_exception_string(event->Exception(), buffer, sizeof(buffer)); return _HandleThreadStopped(NULL, THREAD_STOPPED_EXCEPTION, buffer); }
bool ThreadHandler::HandleSingleStep(SingleStepEvent* event) { // Check whether we're stepping automatically. if (fStepMode != STEP_NONE) { if (_HandleSingleStepStep(event->GetCpuState())) return true; } return _HandleThreadStopped(event->GetCpuState(), THREAD_STOPPED_SINGLE_STEP); }
bool ThreadHandler::HandleBreakpointHit(BreakpointHitEvent* event) { CpuState* cpuState = event->GetCpuState(); target_addr_t instructionPointer = cpuState->InstructionPointer(); TRACE_EVENTS("ThreadHandler::HandleBreakpointHit(): ip: %" B_PRIx64 "\n", instructionPointer); // check whether this is a temporary breakpoint we're waiting for if (fBreakpointAddress != 0 && instructionPointer == fBreakpointAddress && fStepMode != STEP_NONE) { if (fStepMode != STEP_UNTIL && _HandleBreakpointHitStep(cpuState)) return true; } else { // Might be a user breakpoint, but could as well be a temporary // breakpoint of another thread. AutoLocker<Team> locker(fThread->GetTeam()); Breakpoint* breakpoint = fThread->GetTeam()->BreakpointAtAddress( cpuState->InstructionPointer()); bool continueThread = false; if (breakpoint == NULL) { // spurious breakpoint -- might be a temporary breakpoint, that has // already been uninstalled continueThread = true; } else if (!breakpoint->HasEnabledUserBreakpoint()) { // breakpoint of another thread or one that has been disabled in // the meantime continueThread = true; } if (continueThread) { if (fSingleStepping) { // We might have hit a just-installed software breakpoint and // thus haven't stepped at all. Just try again. if (fPreviousInstructionPointer == instructionPointer) { fDebuggerInterface->SingleStepThread(ThreadID()); return true; } // That shouldn't happen. Try something reasonable anyway. if (fStepMode != STEP_NONE) { if (_HandleSingleStepStep(cpuState)) return true; } } return false; } } return _HandleThreadStopped(cpuState, THREAD_STOPPED_BREAKPOINT); }
bool ThreadHandler::HandleWatchpointHit(WatchpointHitEvent* event) { return _HandleThreadStopped(event->GetCpuState(), THREAD_STOPPED_WATCHPOINT); }
bool ThreadHandler::HandleThreadDebugged(ThreadDebuggedEvent* event, const BString& stoppedReason) { return _HandleThreadStopped(NULL, THREAD_STOPPED_DEBUGGED, stoppedReason); }
bool ThreadHandler::HandleThreadDebugged(ThreadDebuggedEvent* event) { return _HandleThreadStopped(NULL, THREAD_STOPPED_DEBUGGED); }