bool MachThread::ThreadDidStop() { // This thread has existed prior to resuming under debug nub control, // and has just been stopped. Do any cleanup that needs to be done // after running. // The thread state and breakpoint will still have the same values // as they had prior to resuming the thread, so it makes it easy to check // if we were trying to step a thread, or we tried to resume while being // at a breakpoint. // When this method gets called, the process state is still in the // state it was in while running so we can act accordingly. m_arch_ap->ThreadDidStop(); // We may have suspended this thread so the primary thread could step // without worrying about race conditions, so lets restore our suspend // count. RestoreSuspendCountAfterStop(); // Update the basic information for a thread MachThread::GetBasicInfo(m_mach_port_number, &m_basic_info); if (m_basic_info.suspend_count > 0) SetState(eStateSuspended); else SetState(eStateStopped); return true; }
bool MachThread::ThreadDidStop() { // This thread has existed prior to resuming under debug nub control, // and has just been stopped. Do any cleanup that needs to be done // after running. // The thread state and breakpoint will still have the same values // as they had prior to resuming the thread, so it makes it easy to check // if we were trying to step a thread, or we tried to resume while being // at a breakpoint. // When this method gets called, the process state is still in the // state it was in while running so we can act accordingly. m_arch_ap->ThreadDidStop(); // We may have suspended this thread so the primary thread could step // without worrying about race conditions, so lets restore our suspend // count. RestoreSuspendCountAfterStop(); // Update the basic information for a thread MachThread::GetBasicInfo(m_tid, &m_basic_info); #if ENABLE_AUTO_STEPPING_OVER_BP // See if we were at a breakpoint when we last resumed that we disabled, // re-enable it. nub_break_t breakID = CurrentBreakpoint(); if (NUB_BREAK_ID_IS_VALID(breakID)) { m_process->EnableBreakpoint(breakID); if (m_basic_info.suspend_count > 0) { SetState(eStateSuspended); } else { // If we last were at a breakpoint and we single stepped, our state // will be "running" to indicate we need to continue after stepping // over the breakpoint instruction. If we step over a breakpoint // instruction, we need to stop. if (GetState() == eStateRunning) { // Leave state set to running so we will continue automatically // from this breakpoint } else { SetState(eStateStopped); } } } else { if (m_basic_info.suspend_count > 0) { SetState(eStateSuspended); } else { SetState(eStateStopped); } } #else if (m_basic_info.suspend_count > 0) SetState(eStateSuspended); else SetState(eStateStopped); #endif return true; }