diff --git a/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp b/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp index f01e599ad5585..e28658e33cdad 100644 --- a/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp +++ b/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp @@ -357,7 +357,6 @@ bool ScriptedProcess::DoUpdateThreadList(ThreadList &old_thread_list, void ScriptedProcess::RefreshStateAfterStop() { // Let all threads recover from stopping and do any clean up based on the // previous thread state (if any). - m_thread_list.RefreshStateAfterStop(); } bool ScriptedProcess::GetProcessInfo(ProcessInstanceInfo &info) { diff --git a/lldb/source/Plugins/Process/scripted/ScriptedThread.cpp b/lldb/source/Plugins/Process/scripted/ScriptedThread.cpp index 1b9841c2048ea..14f4f99cf9c4a 100644 --- a/lldb/source/Plugins/Process/scripted/ScriptedThread.cpp +++ b/lldb/source/Plugins/Process/scripted/ScriptedThread.cpp @@ -145,6 +145,11 @@ bool ScriptedThread::CalculateStopInfo() { StructuredData::DictionarySP dict_sp = GetInterface()->GetStopReason(); Status error; + if (!dict_sp) + return GetInterface()->ErrorWithMessage( + LLVM_PRETTY_FUNCTION, "Failed to get scripted thread stop info.", error, + LIBLLDB_LOG_THREAD); + lldb::StopInfoSP stop_info_sp; lldb::StopReason stop_reason_type; @@ -158,12 +163,12 @@ bool ScriptedThread::CalculateStopInfo() { if (!dict_sp->GetValueForKeyAsDictionary("data", data_dict)) return GetInterface()->ErrorWithMessage( LLVM_PRETTY_FUNCTION, - "Couldn't find value for key 'type' in stop reason dictionary.", error, + "Couldn't find value for key 'data' in stop reason dictionary.", error, LIBLLDB_LOG_THREAD); switch (stop_reason_type) { case lldb::eStopReasonNone: - break; + return true; case lldb::eStopReasonBreakpoint: { lldb::break_id_t break_id; data_dict->GetValueForKeyAsInteger("break_id", break_id, @@ -180,6 +185,13 @@ bool ScriptedThread::CalculateStopInfo() { stop_info_sp = StopInfo::CreateStopReasonWithSignal(*this, signal, description.data()); } break; + case lldb::eStopReasonException: { + llvm::StringRef description; + data_dict->GetValueForKeyAsString("desc", description); + + stop_info_sp = + StopInfo::CreateStopReasonWithException(*this, description.data()); + } break; default: return GetInterface()->ErrorWithMessage( LLVM_PRETTY_FUNCTION, @@ -189,6 +201,9 @@ bool ScriptedThread::CalculateStopInfo() { error, LIBLLDB_LOG_THREAD); } + if (!stop_info_sp) + return false; + SetStopInfo(stop_info_sp); return true; } diff --git a/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py b/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py index be55771c14fb1..4831d48a0b5a9 100644 --- a/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py +++ b/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py @@ -188,13 +188,13 @@ def cleanup(): self.assertEqual(process.GetProcessID(), 42) self.assertEqual(process.GetNumThreads(), 3) - thread = process.GetSelectedThread() + thread = process.GetThreadAtIndex(2) self.assertTrue(thread, "Invalid thread.") - self.assertEqual(thread.GetName(), "StackCoreScriptedThread.thread-0") + self.assertEqual(thread.GetName(), "StackCoreScriptedThread.thread-2") - self.assertEqual(thread.GetNumFrames(), 2) + self.assertEqual(thread.GetNumFrames(), 6) frame = thread.GetSelectedFrame() self.assertTrue(frame, "Invalid frame.") - # self.assertEqual(frame.GetFunctionName(), "bar") - # self.assertEqual(int(frame.FindValue("i", lldb.eValueTypeVariableArgument).GetValue()), 42) - # self.assertEqual(int(frame.FindValue("j", lldb.eValueTypeVariableLocal).GetValue()), 42 * 42) + self.assertIn("bar", frame.GetFunctionName()) + self.assertEqual(int(frame.FindValue("i", lldb.eValueTypeVariableArgument).GetValue()), 42) + self.assertEqual(int(frame.FindValue("j", lldb.eValueTypeVariableLocal).GetValue()), 42 * 42) diff --git a/lldb/test/API/functionalities/scripted_process/stack_core_scripted_process.py b/lldb/test/API/functionalities/scripted_process/stack_core_scripted_process.py index ac455fe3d2717..1fabcf464e7df 100644 --- a/lldb/test/API/functionalities/scripted_process/stack_core_scripted_process.py +++ b/lldb/test/API/functionalities/scripted_process/stack_core_scripted_process.py @@ -117,9 +117,21 @@ def get_name(self) -> str: return StackCoreScriptedThread.__name__ + ".thread-" + str(self.id) def get_stop_reason(self) -> Dict[str, Any]: - return { "type": lldb.eStopReasonSignal, "data": { - "signal": signal.SIGINT - } } + stop_reason = { "type": lldb.eStopReasonInvalid, "data": { }} + + if self.corefile_thread and self.corefile_thread.IsValid: + stop_reason["type"] = self.corefile_thread.GetStopReason() + + if self.corefile_thread.GetStopReasonDataCount() > 0: + if stop_reason["type"] == lldb.eStopReasonBreakpoint: + stop_reason["data"]["break_id"] = self.corefile_thread.GetStopReasonDataAtIndex(0) + stop_reason["data"]["break_loc_id"] = self.corefile_thread.GetStopReasonDataAtIndex(1) + elif stop_reason["type"] == lldb.eStopReasonSignal: + stop_reason["data"]["signal"] = signal.SIGINT + elif stop_reason["type"] == lldb.eStopReasonException: + stop_reason["data"]["desc"] = self.corefile_thread.GetStopDescription(100) + + return stop_reason def get_stackframes(self): class ScriptedStackFrame: