[Lldb-commits] [lldb] [lldb] Add OS plugin property for reporting all threads (PR #123145)
Felipe de Azevedo Piovezan via lldb-commits
lldb-commits at lists.llvm.org
Thu Jan 16 14:45:15 PST 2025
https://github.com/felipepiovezan updated https://github.com/llvm/llvm-project/pull/123145
>From ac1711204064c4740d5f1386bc6132d4d968dda3 Mon Sep 17 00:00:00 2001
From: Felipe de Azevedo Piovezan <fpiovezan at apple.com>
Date: Tue, 14 Jan 2025 09:27:29 -0800
Subject: [PATCH 1/2] [lldb] Add OS plugin property for reporting all threads
Currently, an LLDB target option controls whether plugins report all
threads. However, it seems natural for this knowledge could come from
the plugin itself. To support this, this commits adds a virtual method
to the plugin base class, making the Python OS query the target option
to preserve existing behavior.
---
lldb/include/lldb/Target/OperatingSystem.h | 2 ++
.../Plugins/OperatingSystem/Python/OperatingSystemPython.cpp | 4 ++++
.../Plugins/OperatingSystem/Python/OperatingSystemPython.h | 2 ++
lldb/source/Target/Process.cpp | 2 +-
lldb/source/Target/TargetProperties.td | 2 +-
5 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/lldb/include/lldb/Target/OperatingSystem.h b/lldb/include/lldb/Target/OperatingSystem.h
index ceeddceb0f2c12..128239569790fc 100644
--- a/lldb/include/lldb/Target/OperatingSystem.h
+++ b/lldb/include/lldb/Target/OperatingSystem.h
@@ -61,6 +61,8 @@ class OperatingSystem : public PluginInterface {
virtual bool IsOperatingSystemPluginThread(const lldb::ThreadSP &thread_sp);
+ virtual bool DoesPluginReportAllThreads() = 0;
+
protected:
// Member variables.
Process
diff --git a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp
index 3848a2b1deb97f..7230e590ba03b9 100644
--- a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp
+++ b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp
@@ -386,4 +386,8 @@ lldb::ThreadSP OperatingSystemPython::CreateThread(lldb::tid_t tid,
return ThreadSP();
}
+bool OperatingSystemPython::DoesPluginReportAllThreads() {
+ return m_process->GetOSPluginReportsAllThreads();
+}
+
#endif // #if LLDB_ENABLE_PYTHON
diff --git a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h
index 90973acde3ebfd..980a544241de4f 100644
--- a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h
+++ b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.h
@@ -60,6 +60,8 @@ class OperatingSystemPython : public lldb_private::OperatingSystem {
// Method for lazy creation of threads on demand
lldb::ThreadSP CreateThread(lldb::tid_t tid, lldb::addr_t context) override;
+ bool DoesPluginReportAllThreads() override;
+
protected:
bool IsValid() const {
return m_script_object_sp && m_script_object_sp->IsValid();
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index 68485a40a3fcce..c47e728fdf716c 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -1182,7 +1182,7 @@ void Process::UpdateThreadListIfNeeded() {
// See if the OS plugin reports all threads. If it does, then
// it is safe to clear unseen thread's plans here. Otherwise we
// should preserve them in case they show up again:
- clear_unused_threads = GetOSPluginReportsAllThreads();
+ clear_unused_threads = os->DoesPluginReportAllThreads();
// Turn off dynamic types to ensure we don't run any expressions.
// Objective-C can run an expression to determine if a SBValue is a
diff --git a/lldb/source/Target/TargetProperties.td b/lldb/source/Target/TargetProperties.td
index bb3b500d5fdfbd..38a345dfd88495 100644
--- a/lldb/source/Target/TargetProperties.td
+++ b/lldb/source/Target/TargetProperties.td
@@ -223,7 +223,7 @@ let Definition = "process_experimental" in {
def OSPluginReportsAllThreads: Property<"os-plugin-reports-all-threads", "Boolean">,
Global,
DefaultTrue,
- Desc<"Set to False if your OS Plugins doesn't report all threads on each stop.">;
+ Desc<"Set to False if your Python OS Plugin doesn't report all threads on each stop.">;
}
let Definition = "process" in {
>From 8e1c14a54e524603bab9b329c9ea51386741c490 Mon Sep 17 00:00:00 2001
From: Felipe de Azevedo Piovezan <fpiovezan at apple.com>
Date: Thu, 16 Jan 2025 14:43:44 -0800
Subject: [PATCH 2/2] fixup! Add python binding methods
---
.../Interpreter/Interfaces/OperatingSystemInterface.h | 2 ++
.../OperatingSystem/Python/OperatingSystemPython.cpp | 4 ++++
.../Interfaces/OperatingSystemPythonInterface.cpp | 10 ++++++++++
.../Python/Interfaces/OperatingSystemPythonInterface.h | 2 ++
.../stepping_plugin_threads/TestOSPluginStepping.py | 5 -----
.../stepping_plugin_threads/operating_system.py | 3 +++
6 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/lldb/include/lldb/Interpreter/Interfaces/OperatingSystemInterface.h b/lldb/include/lldb/Interpreter/Interfaces/OperatingSystemInterface.h
index 3c46f99f3b356f..58aab7ec914dd3 100644
--- a/lldb/include/lldb/Interpreter/Interfaces/OperatingSystemInterface.h
+++ b/lldb/include/lldb/Interpreter/Interfaces/OperatingSystemInterface.h
@@ -27,6 +27,8 @@ class OperatingSystemInterface : virtual public ScriptedThreadInterface {
virtual std::optional<std::string> GetRegisterContextForTID(lldb::tid_t tid) {
return std::nullopt;
}
+
+ virtual std::optional<bool> DoesPluginReportAllThreads() { return {}; }
};
} // namespace lldb_private
diff --git a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp
index 7230e590ba03b9..aff521890858c3 100644
--- a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp
+++ b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp
@@ -387,6 +387,10 @@ lldb::ThreadSP OperatingSystemPython::CreateThread(lldb::tid_t tid,
}
bool OperatingSystemPython::DoesPluginReportAllThreads() {
+ // If the python plugin has a "DoesPluginReportAllThreads" method, use it.
+ if (std::optional<bool> plugin_answer =
+ m_operating_system_interface_sp->DoesPluginReportAllThreads())
+ return *plugin_answer;
return m_process->GetOSPluginReportsAllThreads();
}
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.cpp
index c3379e774a0b81..d8b2ea984fd88e 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.cpp
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.cpp
@@ -82,6 +82,16 @@ OperatingSystemPythonInterface::GetRegisterContextForTID(lldb::tid_t tid) {
return obj->GetAsString()->GetValue().str();
}
+std::optional<bool> OperatingSystemPythonInterface::DoesPluginReportAllThreads() {
+ Status error;
+ StructuredData::ObjectSP obj = Dispatch("does_plugin_report_all_threads", error);
+ if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj,
+ error))
+ return {};
+
+ return obj->GetAsBoolean()->GetValue();
+}
+
void OperatingSystemPythonInterface::Initialize() {
const std::vector<llvm::StringRef> ci_usages = {
"settings set target.process.python-os-plugin-path <script-path>",
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h
index 102c3c39537686..8df48f1b64cc91 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/OperatingSystemPythonInterface.h
@@ -45,6 +45,8 @@ class OperatingSystemPythonInterface
std::optional<std::string> GetRegisterContextForTID(lldb::tid_t tid) override;
+ std::optional<bool> DoesPluginReportAllThreads() override;
+
static void Initialize();
static void Terminate();
diff --git a/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/TestOSPluginStepping.py b/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/TestOSPluginStepping.py
index 47d6f5d68bbe69..0d06a9da6535c1 100644
--- a/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/TestOSPluginStepping.py
+++ b/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/TestOSPluginStepping.py
@@ -40,11 +40,6 @@ def is_os_thread(self, thread):
def run_python_os_step_missing_thread(self, do_prune):
"""Test that the Python operating system plugin works correctly"""
- # Our OS plugin does NOT report all threads:
- result = self.dbg.HandleCommand(
- "settings set process.experimental.os-plugin-reports-all-threads false"
- )
-
python_os_plugin_path = os.path.join(self.getSourceDir(), "operating_system.py")
(target, self.process, thread, thread_bkpt) = lldbutil.run_to_source_breakpoint(
self, "first stop in thread - do a step out", self.main_file
diff --git a/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/operating_system.py b/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/operating_system.py
index eb02ff534f210f..855cdbaf7cdc8a 100644
--- a/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/operating_system.py
+++ b/lldb/test/API/functionalities/plugins/python_os_plugin/stepping_plugin_threads/operating_system.py
@@ -34,6 +34,9 @@ def __init__(self, process):
if not self.g_value.IsValid():
print("Could not find g_value")
+ def does_plugin_report_all_threads(self):
+ return False
+
def create_thread(self, tid, context):
print("Called create thread with tid: ", tid)
return None
More information about the lldb-commits
mailing list