diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h index e837973d04966..657fa0d5a6d72 100644 --- a/lldb/include/lldb/Target/Process.h +++ b/lldb/include/lldb/Target/Process.h @@ -98,6 +98,7 @@ class ProcessProperties : public Properties { void SetStopOnSharedLibraryEvents(bool stop); bool GetDisableLangRuntimeUnwindPlans() const; void SetDisableLangRuntimeUnwindPlans(bool disable); + void DisableLanguageRuntimeUnwindPlansCallback(); bool GetDetachKeepsStopped() const; void SetDetachKeepsStopped(bool keep_stopped); bool GetWarningsOptimization() const; diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 8be1ecffead0f..294b7fbd1ee6b 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -207,6 +207,9 @@ ProcessProperties::ProcessProperties(lldb_private::Process *process) m_collection_sp->SetValueChangedCallback( ePropertyPythonOSPluginPath, [this] { m_process->LoadOperatingSystemPlugin(true); }); + m_collection_sp->SetValueChangedCallback( + ePropertyDisableLangRuntimeUnwindPlans, + [this] { DisableLanguageRuntimeUnwindPlansCallback(); }); } m_experimental_properties_up = @@ -321,6 +324,15 @@ void ProcessProperties::SetDisableLangRuntimeUnwindPlans(bool disable) { m_process->Flush(); } +void ProcessProperties::DisableLanguageRuntimeUnwindPlansCallback() { + if (!m_process) + return; + for (auto thread_sp : m_process->Threads()) { + thread_sp->ClearStackFrames(); + thread_sp->DiscardThreadPlans(/*force*/ true); + } +} + bool ProcessProperties::GetDetachKeepsStopped() const { const uint32_t idx = ePropertyDetachKeepsStopped; return GetPropertyAtIndexAs( diff --git a/lldb/test/API/lang/swift/async/unwind/disable_language_unwinder/Makefile b/lldb/test/API/lang/swift/async/unwind/disable_language_unwinder/Makefile new file mode 100644 index 0000000000000..cca30b939e652 --- /dev/null +++ b/lldb/test/API/lang/swift/async/unwind/disable_language_unwinder/Makefile @@ -0,0 +1,3 @@ +SWIFT_SOURCES := main.swift +SWIFTFLAGS_EXTRAS := -parse-as-library +include Makefile.rules diff --git a/lldb/test/API/lang/swift/async/unwind/disable_language_unwinder/TestDisableLanguageUnwinder.py b/lldb/test/API/lang/swift/async/unwind/disable_language_unwinder/TestDisableLanguageUnwinder.py new file mode 100644 index 0000000000000..f640b4245f084 --- /dev/null +++ b/lldb/test/API/lang/swift/async/unwind/disable_language_unwinder/TestDisableLanguageUnwinder.py @@ -0,0 +1,25 @@ +import lldb +from lldbsuite.test.decorators import * +import lldbsuite.test.lldbtest as lldbtest +import lldbsuite.test.lldbutil as lldbutil + +class TestDisableLanguageUnwinder(lldbtest.TestBase): + + @swiftTest + @skipIf(oslist=['windows', 'linux']) + def test(self): + """Test async unwind""" + self.build() + src = lldb.SBFileSpec('main.swift') + target, process, thread, bkpt = lldbutil.run_to_source_breakpoint( + self, 'break here', src) + + self.assertIn("syncFunc", thread.GetFrameAtIndex(0).GetFunctionName()) + self.assertIn("callSyncFunc", thread.GetFrameAtIndex(1).GetFunctionName()) + self.assertIn("main", thread.GetFrameAtIndex(2).GetFunctionName()) + + self.runCmd("settings set target.process.disable-language-runtime-unwindplans true") + + self.assertIn("syncFunc", thread.GetFrameAtIndex(0).GetFunctionName()) + self.assertIn("callSyncFunc", thread.GetFrameAtIndex(1).GetFunctionName()) + self.assertNotIn("main", thread.GetFrameAtIndex(2).GetFunctionName()) diff --git a/lldb/test/API/lang/swift/async/unwind/disable_language_unwinder/main.swift b/lldb/test/API/lang/swift/async/unwind/disable_language_unwinder/main.swift new file mode 100644 index 0000000000000..32c1804b10166 --- /dev/null +++ b/lldb/test/API/lang/swift/async/unwind/disable_language_unwinder/main.swift @@ -0,0 +1,13 @@ +func syncFunc() { + print("break here") +} + +func callSyncFunc() async { + syncFunc() +} + +@main struct Main { + static func main() async { + await callSyncFunc() + } +}