void POSIXThread::SignalNotify(const ProcessMessage &message) { int signo = message.GetSignal(); m_stop_info = StopInfo::CreateStopReasonWithSignal(*this, signo); SetResumeSignal(signo); }
void POSIXThread::SignalDeliveredNotify(const ProcessMessage &message) { int signo = message.GetSignal(); SetStopInfo (StopInfo::CreateStopReasonWithSignal(*this, signo)); SetResumeSignal(signo); }
void POSIXThread::SignalDeliveredNotify(const ProcessMessage &message) { int signo = message.GetSignal(); // Just treat debugger generated signal events like breakpoints for now. m_stop_info = StopInfo::CreateStopReasonToTrace(*this); SetResumeSignal(signo); }
void FreeBSDThread::SignalNotify(const ProcessMessage &message) { int signo = message.GetSignal(); if (message.GetKind() == ProcessMessage::eCrashMessage) { std::string stop_description = GetCrashReasonString( message.GetCrashReason(), message.GetFaultAddress()); SetStopInfo(StopInfo::CreateStopReasonWithSignal( *this, signo, stop_description.c_str())); } else { SetStopInfo(StopInfo::CreateStopReasonWithSignal(*this, signo)); } }
void POSIXThread::CrashNotify(const ProcessMessage &message) { int signo = message.GetSignal(); assert(message.GetKind() == ProcessMessage::eCrashMessage); LogSP log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); if (log) log->Printf ("POSIXThread::%s () signo = %i, reason = '%s'", __FUNCTION__, signo, message.PrintCrashReason()); m_stop_info = lldb::StopInfoSP(new POSIXCrashStopInfo( *this, signo, message.GetCrashReason())); SetResumeSignal(signo); }
void POSIXThread::CrashNotify(const ProcessMessage &message) { // FIXME: Update stop reason as per bugzilla 14598 int signo = message.GetSignal(); assert(message.GetKind() == ProcessMessage::eCrashMessage); Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); if (log) log->Printf ("POSIXThread::%s () signo = %i, reason = '%s'", __FUNCTION__, signo, message.PrintCrashReason()); SetStopInfo (lldb::StopInfoSP(new POSIXCrashStopInfo(*this, signo, message.GetCrashReason(), message.GetFaultAddress()))); }
void ProcessPOSIX::SendMessage(const ProcessMessage &message) { Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS)); Mutex::Locker lock(m_message_mutex); Mutex::Locker thread_lock(m_thread_list.GetMutex()); POSIXThread *thread = static_cast<POSIXThread*>( m_thread_list.FindThreadByID(message.GetTID(), false).get()); switch (message.GetKind()) { case ProcessMessage::eInvalidMessage: return; case ProcessMessage::eAttachMessage: SetPrivateState(eStateStopped); return; case ProcessMessage::eLimboMessage: assert(thread); thread->SetState(eStateStopped); if (message.GetTID() == GetID()) { m_exit_status = message.GetExitStatus(); if (m_exit_now) { SetPrivateState(eStateExited); m_monitor->Detach(GetID()); } else { StopAllThreads(message.GetTID()); SetPrivateState(eStateStopped); } } else { StopAllThreads(message.GetTID()); SetPrivateState(eStateStopped); } break; case ProcessMessage::eExitMessage: if (thread != nullptr) thread->SetState(eStateExited); else { if (log) log->Warning ("ProcessPOSIX::%s eExitMessage for TID %" PRIu64 " failed to find a thread to mark as eStateExited, ignoring", __FUNCTION__, message.GetTID ()); } // FIXME: I'm not sure we need to do this. if (message.GetTID() == GetID()) { SetExitStatus(message.GetExitStatus(), NULL); } else if (!IsAThreadRunning()) SetPrivateState(eStateStopped); break; case ProcessMessage::eSignalMessage: case ProcessMessage::eSignalDeliveredMessage: if (message.GetSignal() == SIGSTOP && AddThreadForInitialStopIfNeeded(message.GetTID())) return; // Intentional fall-through case ProcessMessage::eBreakpointMessage: case ProcessMessage::eTraceMessage: case ProcessMessage::eWatchpointMessage: case ProcessMessage::eCrashMessage: assert(thread); thread->SetState(eStateStopped); StopAllThreads(message.GetTID()); SetPrivateState(eStateStopped); break; case ProcessMessage::eNewThreadMessage: { lldb::tid_t new_tid = message.GetChildTID(); if (WaitingForInitialStop(new_tid)) { m_monitor->WaitForInitialTIDStop(new_tid); } assert(thread); thread->SetState(eStateStopped); StopAllThreads(message.GetTID()); SetPrivateState(eStateStopped); break; } case ProcessMessage::eExecMessage: { assert(thread); thread->SetState(eStateStopped); StopAllThreads(message.GetTID()); SetPrivateState(eStateStopped); break; } } m_message_queue.push(message); }
void ProcessPOSIX::SendMessage(const ProcessMessage &message) { Mutex::Locker lock(m_message_mutex); Mutex::Locker thread_lock(m_thread_list.GetMutex()); POSIXThread *thread = static_cast<POSIXThread*>( m_thread_list.FindThreadByID(message.GetTID(), false).get()); switch (message.GetKind()) { case ProcessMessage::eInvalidMessage: return; case ProcessMessage::eLimboMessage: assert(thread); thread->SetState(eStateStopped); if (message.GetTID() == GetID()) { m_exit_status = message.GetExitStatus(); if (m_exit_now) { SetPrivateState(eStateExited); m_monitor->Detach(GetID()); } else { StopAllThreads(message.GetTID()); SetPrivateState(eStateStopped); } } else { StopAllThreads(message.GetTID()); SetPrivateState(eStateStopped); } break; case ProcessMessage::eExitMessage: assert(thread); thread->SetState(eStateExited); // FIXME: I'm not sure we need to do this. if (message.GetTID() == GetID()) { m_exit_status = message.GetExitStatus(); SetExitStatus(m_exit_status, NULL); } else if (!IsAThreadRunning()) SetPrivateState(eStateStopped); break; assert(thread); thread->SetState(eStateStopped); StopAllThreads(message.GetTID()); SetPrivateState(eStateStopped); break; case ProcessMessage::eSignalMessage: case ProcessMessage::eSignalDeliveredMessage: if (message.GetSignal() == SIGSTOP && AddThreadForInitialStopIfNeeded(message.GetTID())) return; // Intentional fall-through case ProcessMessage::eBreakpointMessage: case ProcessMessage::eTraceMessage: case ProcessMessage::eWatchpointMessage: case ProcessMessage::eNewThreadMessage: case ProcessMessage::eCrashMessage: assert(thread); thread->SetState(eStateStopped); StopAllThreads(message.GetTID()); SetPrivateState(eStateStopped); break; } m_message_queue.push(message); }