diff --git a/lldb/include/lldb/lldb-enumerations.h b/lldb/include/lldb/lldb-enumerations.h index 2b998741d358..b4ed1f52e8ad 100644 --- a/lldb/include/lldb/lldb-enumerations.h +++ b/lldb/include/lldb/lldb-enumerations.h @@ -177,7 +177,8 @@ namespace lldb { eStopReasonSignal, eStopReasonException, eStopReasonExec, // Program was re-exec'ed - eStopReasonPlanComplete + eStopReasonPlanComplete, + eStopReasonThreadExiting } StopReason; //---------------------------------------------------------------------- diff --git a/lldb/source/API/SBThread.cpp b/lldb/source/API/SBThread.cpp index c1e834bbd92a..3f3c90415a05 100644 --- a/lldb/source/API/SBThread.cpp +++ b/lldb/source/API/SBThread.cpp @@ -151,6 +151,7 @@ SBThread::GetStopReasonDataCount () case eStopReasonTrace: case eStopReasonExec: case eStopReasonPlanComplete: + case eStopReasonThreadExiting: // There is no data for these stop reasons. return 0; @@ -209,6 +210,7 @@ SBThread::GetStopReasonDataAtIndex (uint32_t idx) case eStopReasonTrace: case eStopReasonExec: case eStopReasonPlanComplete: + case eStopReasonThreadExiting: // There is no data for these stop reasons. return 0; @@ -348,6 +350,13 @@ SBThread::GetStopDescription (char *dst, size_t dst_len) } break; + case eStopReasonThreadExiting: + { + char limbo_desc[] = "thread exiting"; + stop_desc = limbo_desc; + stop_desc_len = sizeof(limbo_desc); + } + break; default: break; } diff --git a/lldb/source/Plugins/Process/POSIX/POSIXStopInfo.cpp b/lldb/source/Plugins/Process/POSIX/POSIXStopInfo.cpp index 79f0a58115b9..3dd3c869884b 100644 --- a/lldb/source/Plugins/Process/POSIX/POSIXStopInfo.cpp +++ b/lldb/source/Plugins/Process/POSIX/POSIXStopInfo.cpp @@ -21,7 +21,7 @@ POSIXLimboStopInfo::~POSIXLimboStopInfo() { } lldb::StopReason POSIXLimboStopInfo::GetStopReason() const { - return lldb::eStopReasonTrace; + return lldb::eStopReasonThreadExiting; } const char * @@ -33,13 +33,13 @@ POSIXLimboStopInfo::GetDescription() bool POSIXLimboStopInfo::ShouldStop(Event *event_ptr) { - return true; + return false; } bool POSIXLimboStopInfo::ShouldNotify(Event *event_ptr) { - return true; + return false; } //===----------------------------------------------------------------------===// diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index 7c5a0d7c2fc1..4750a4dc910c 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -1582,15 +1582,16 @@ Thread::StopReasonAsCString (lldb::StopReason reason) { switch (reason) { - case eStopReasonInvalid: return "invalid"; - case eStopReasonNone: return "none"; - case eStopReasonTrace: return "trace"; - case eStopReasonBreakpoint: return "breakpoint"; - case eStopReasonWatchpoint: return "watchpoint"; - case eStopReasonSignal: return "signal"; - case eStopReasonException: return "exception"; - case eStopReasonExec: return "exec"; - case eStopReasonPlanComplete: return "plan complete"; + case eStopReasonInvalid: return "invalid"; + case eStopReasonNone: return "none"; + case eStopReasonTrace: return "trace"; + case eStopReasonBreakpoint: return "breakpoint"; + case eStopReasonWatchpoint: return "watchpoint"; + case eStopReasonSignal: return "signal"; + case eStopReasonException: return "exception"; + case eStopReasonExec: return "exec"; + case eStopReasonPlanComplete: return "plan complete"; + case eStopReasonThreadExiting: return "thread exiting"; } diff --git a/lldb/source/Target/ThreadPlanBase.cpp b/lldb/source/Target/ThreadPlanBase.cpp index ebf468603cf7..444083748845 100644 --- a/lldb/source/Target/ThreadPlanBase.cpp +++ b/lldb/source/Target/ThreadPlanBase.cpp @@ -146,7 +146,8 @@ ThreadPlanBase::ShouldStop (Event *event_ptr) log->Printf("Base plan discarding thread plans for thread tid = 0x%4.4" PRIx64 " (exec.)", m_thread.GetID()); m_thread.DiscardThreadPlans(false); return true; - + + case eStopReasonThreadExiting: case eStopReasonSignal: if (stop_info_sp->ShouldStop(event_ptr)) { diff --git a/lldb/source/Target/ThreadPlanStepInRange.cpp b/lldb/source/Target/ThreadPlanStepInRange.cpp index 1e512452c9ac..d4324b6ec09d 100644 --- a/lldb/source/Target/ThreadPlanStepInRange.cpp +++ b/lldb/source/Target/ThreadPlanStepInRange.cpp @@ -384,6 +384,7 @@ ThreadPlanStepInRange::PlanExplainsStop () case eStopReasonSignal: case eStopReasonException: case eStopReasonExec: + case eStopReasonThreadExiting: { LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); if (log) diff --git a/lldb/source/Target/ThreadPlanStepOut.cpp b/lldb/source/Target/ThreadPlanStepOut.cpp index 534332415c2c..678498f68b24 100644 --- a/lldb/source/Target/ThreadPlanStepOut.cpp +++ b/lldb/source/Target/ThreadPlanStepOut.cpp @@ -252,6 +252,7 @@ ThreadPlanStepOut::PlanExplainsStop () case eStopReasonSignal: case eStopReasonException: case eStopReasonExec: + case eStopReasonThreadExiting: return false; default: diff --git a/lldb/source/Target/ThreadPlanStepOverRange.cpp b/lldb/source/Target/ThreadPlanStepOverRange.cpp index 66754d24f89e..7851f7081d7c 100644 --- a/lldb/source/Target/ThreadPlanStepOverRange.cpp +++ b/lldb/source/Target/ThreadPlanStepOverRange.cpp @@ -320,6 +320,7 @@ ThreadPlanStepOverRange::PlanExplainsStop () case eStopReasonSignal: case eStopReasonException: case eStopReasonExec: + case eStopReasonThreadExiting: default: if (log) log->PutCString ("ThreadPlanStepInRange got asked if it explains the stop for some reason other than step."); diff --git a/lldb/source/Target/ThreadPlanStepUntil.cpp b/lldb/source/Target/ThreadPlanStepUntil.cpp index 95b0a352f2c3..deda7d9184e7 100644 --- a/lldb/source/Target/ThreadPlanStepUntil.cpp +++ b/lldb/source/Target/ThreadPlanStepUntil.cpp @@ -292,6 +292,7 @@ ThreadPlanStepUntil::AnalyzeStop() case eStopReasonSignal: case eStopReasonException: case eStopReasonExec: + case eStopReasonThreadExiting: m_explains_stop = false; break; default: diff --git a/lldb/tools/driver/Driver.cpp b/lldb/tools/driver/Driver.cpp index 96fd4cfc038c..623eddf773ae 100644 --- a/lldb/tools/driver/Driver.cpp +++ b/lldb/tools/driver/Driver.cpp @@ -807,6 +807,7 @@ Driver::UpdateSelectedThread () case eStopReasonSignal: case eStopReasonException: case eStopReasonExec: + case eStopReasonThreadExiting: if (!other_thread.IsValid()) other_thread = thread; break;