[Lldb-commits] [lldb] [lldb][Commands] Show symbol change bit in SB API (PR #66144)
Chelsea Cassanova via lldb-commits
lldb-commits at lists.llvm.org
Thu Sep 14 13:34:32 PDT 2023
https://github.com/chelcassanova updated https://github.com/llvm/llvm-project/pull/66144:
>From 8754d93a72bdff94f95f991d9bf1112e5f9fe692 Mon Sep 17 00:00:00 2001
From: Chelsea Cassanova <cassanova at Chelseas-MacBook-Pro-2.local>
Date: Tue, 12 Sep 2023 13:49:50 -0700
Subject: [PATCH 1/4] [lldb][Commands] Show symbol change bit in SB API
This exposes the `eBroadcastBitSymbolChange` bit to the SB
API to show when a symbol change event has been broadcast as
this wasn't being done before. Also refactors `eBroadcastSymbolChange`
to `eBroadcastBitSymbolChange` to match the naming convention
for other event bits used in the debugger.
---
lldb/include/lldb/API/SBDebugger.h | 2 ++
lldb/include/lldb/Core/Debugger.h | 2 +-
lldb/source/Commands/CommandObjectTarget.cpp | 4 ++++
lldb/source/Core/Debugger.cpp | 4 ++--
.../add-dsym/uuid/TestAddDsymCommand.py | 24 +++++++++++++++++++
5 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/lldb/include/lldb/API/SBDebugger.h b/lldb/include/lldb/API/SBDebugger.h
index 29cf2c16fad4bd7..abb08e93d197a18 100644
--- a/lldb/include/lldb/API/SBDebugger.h
+++ b/lldb/include/lldb/API/SBDebugger.h
@@ -13,6 +13,7 @@
#include "lldb/API/SBDefines.h"
#include "lldb/API/SBPlatform.h"
+#include "lldb/API/SBStructuredData.h"
namespace lldb_private {
class CommandPluginInterfaceImplementation;
@@ -46,6 +47,7 @@ class LLDB_API SBDebugger {
eBroadcastBitProgress = (1 << 0),
eBroadcastBitWarning = (1 << 1),
eBroadcastBitError = (1 << 2),
+ eBroadcastBitSymbolChange = (1 << 3),
};
SBDebugger();
diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h
index 5532cace606bfed..6cdf1a183b18e54 100644
--- a/lldb/include/lldb/Core/Debugger.h
+++ b/lldb/include/lldb/Core/Debugger.h
@@ -83,7 +83,7 @@ class Debugger : public std::enable_shared_from_this<Debugger>,
eBroadcastBitProgress = (1 << 0),
eBroadcastBitWarning = (1 << 1),
eBroadcastBitError = (1 << 2),
- eBroadcastSymbolChange = (1 << 3),
+ eBroadcastBitSymbolChange = (1 << 3),
};
using DebuggerList = std::vector<lldb::DebuggerSP>;
diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp
index 3e024ff91b382d7..8051b3826294ab3 100644
--- a/lldb/source/Commands/CommandObjectTarget.cpp
+++ b/lldb/source/Commands/CommandObjectTarget.cpp
@@ -4504,6 +4504,10 @@ class CommandObjectTargetSymbolsAdd : public CommandObjectParsed {
if (process)
process->Flush();
}
+
+ if (result.Succeeded())
+ Debugger::ReportSymbolChange(module_spec);
+
return result.Succeeded();
}
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp
index 7ec1efc64fe9383..924741f45040bf0 100644
--- a/lldb/source/Core/Debugger.cpp
+++ b/lldb/source/Core/Debugger.cpp
@@ -1536,7 +1536,7 @@ void Debugger::ReportSymbolChange(const ModuleSpec &module_spec) {
std::lock_guard<std::recursive_mutex> guard(*g_debugger_list_mutex_ptr);
for (DebuggerSP debugger_sp : *g_debugger_list_ptr) {
EventSP event_sp = std::make_shared<Event>(
- Debugger::eBroadcastSymbolChange,
+ Debugger::eBroadcastBitSymbolChange,
new SymbolChangeEventData(debugger_sp, module_spec));
debugger_sp->GetBroadcaster().BroadcastEvent(event_sp);
}
@@ -1844,7 +1844,7 @@ lldb::thread_result_t Debugger::DefaultEventHandler() {
listener_sp->StartListeningForEvents(
&m_broadcaster, eBroadcastBitProgress | eBroadcastBitWarning |
- eBroadcastBitError | eBroadcastSymbolChange);
+ eBroadcastBitError | eBroadcastBitSymbolChange);
// Let the thread that spawned us know that we have started up and that we
// are now listening to all required events so no events get missed
diff --git a/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py b/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py
index d16ca32d79e6808..01b7d41f85c1185 100644
--- a/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py
+++ b/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py
@@ -57,6 +57,30 @@ def test_add_dsym_with_dSYM_bundle(self):
self.exe_name = "a.out"
self.do_add_dsym_with_dSYM_bundle(self.exe_name)
+ @no_debug_info_test
+ def test_report_symbol_change(self):
+ """Test that when adding a symbol file, the eBroadcastBitSymbolChange event gets broadcasted."""
+ self.generate_main_cpp(version=1)
+ self.build(debug_info="dsym")
+
+ self.exe_name = "a.out"
+
+ # Get the broadcaster and listen for the symbol change event
+ self.broadcaster = self.dbg.GetBroadcaster()
+ self.listener = lldbutil.start_listening_from(
+ self.broadcaster, lldb.SBDebugger.eBroadcastBitSymbolChange
+ )
+
+ # Add the dSYM
+ self.do_add_dsym_with_success(self.exe_name)
+
+ # Get the next event
+ event = lldbutil.fetch_next_event(self, self.listener, self.broadcaster)
+
+ # Check that the event is valid
+ self.assertTrue(event.IsValid(), "Got a valid eBroadcastBitSymbolChange event.")
+
+
def generate_main_cpp(self, version=0):
"""Generate main.cpp from main.cpp.template."""
temp = os.path.join(self.getSourceDir(), self.template)
>From 0ae976f96a591d8129a459312fcd974d6ab3ea7d Mon Sep 17 00:00:00 2001
From: Chelsea Cassanova <cassanova at Chelseas-MacBook-Pro-2.local>
Date: Wed, 13 Sep 2023 13:11:21 -0700
Subject: [PATCH 2/4] fixup! [lldb][Commands] Show symbol change bit in SB API
---
lldb/include/lldb/API/SBDebugger.h | 2 --
lldb/include/lldb/API/SBTarget.h | 3 ++-
lldb/include/lldb/Core/Debugger.h | 2 +-
lldb/include/lldb/Target/Target.h | 3 ++-
lldb/source/Core/Debugger.cpp | 4 ++--
lldb/source/Core/DebuggerEvents.cpp | 5 +++-
lldb/source/Target/Target.cpp | 5 ++--
.../add-dsym/uuid/TestAddDsymCommand.py | 24 +++++++++++--------
8 files changed, 28 insertions(+), 20 deletions(-)
diff --git a/lldb/include/lldb/API/SBDebugger.h b/lldb/include/lldb/API/SBDebugger.h
index abb08e93d197a18..29cf2c16fad4bd7 100644
--- a/lldb/include/lldb/API/SBDebugger.h
+++ b/lldb/include/lldb/API/SBDebugger.h
@@ -13,7 +13,6 @@
#include "lldb/API/SBDefines.h"
#include "lldb/API/SBPlatform.h"
-#include "lldb/API/SBStructuredData.h"
namespace lldb_private {
class CommandPluginInterfaceImplementation;
@@ -47,7 +46,6 @@ class LLDB_API SBDebugger {
eBroadcastBitProgress = (1 << 0),
eBroadcastBitWarning = (1 << 1),
eBroadcastBitError = (1 << 2),
- eBroadcastBitSymbolChange = (1 << 3),
};
SBDebugger();
diff --git a/lldb/include/lldb/API/SBTarget.h b/lldb/include/lldb/API/SBTarget.h
index 07bd6a8b76d2f19..d1cd23af67dccb4 100644
--- a/lldb/include/lldb/API/SBTarget.h
+++ b/lldb/include/lldb/API/SBTarget.h
@@ -40,7 +40,8 @@ class LLDB_API SBTarget {
eBroadcastBitModulesLoaded = (1 << 1),
eBroadcastBitModulesUnloaded = (1 << 2),
eBroadcastBitWatchpointChanged = (1 << 3),
- eBroadcastBitSymbolsLoaded = (1 << 4)
+ eBroadcastBitSymbolsLoaded = (1 << 4),
+ eBroadcastBitSymbolsChanged = (1 << 5),
};
// Constructors
diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h
index 6cdf1a183b18e54..7a6aa9ad5f503ef 100644
--- a/lldb/include/lldb/Core/Debugger.h
+++ b/lldb/include/lldb/Core/Debugger.h
@@ -83,7 +83,7 @@ class Debugger : public std::enable_shared_from_this<Debugger>,
eBroadcastBitProgress = (1 << 0),
eBroadcastBitWarning = (1 << 1),
eBroadcastBitError = (1 << 2),
- eBroadcastBitSymbolChange = (1 << 3),
+ eBroadcastBitSymbolFileChange = (1 << 3),
};
using DebuggerList = std::vector<lldb::DebuggerSP>;
diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h
index ed0ecbbddbf8149..b479229417b3b23 100644
--- a/lldb/include/lldb/Target/Target.h
+++ b/lldb/include/lldb/Target/Target.h
@@ -9,6 +9,7 @@
#ifndef LLDB_TARGET_TARGET_H
#define LLDB_TARGET_TARGET_H
+#include <_types/_uint32_t.h>
#include <list>
#include <map>
#include <memory>
@@ -875,7 +876,7 @@ class Target : public std::enable_shared_from_this<Target>,
void ModulesDidUnload(ModuleList &module_list, bool delete_locations);
- void SymbolsDidLoad(ModuleList &module_list);
+ void SymbolsDidLoad(ModuleList &module_list, uint32_t load_or_change_broadcast_bit);
void ClearModules(bool delete_locations);
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp
index 924741f45040bf0..d32823ab052e089 100644
--- a/lldb/source/Core/Debugger.cpp
+++ b/lldb/source/Core/Debugger.cpp
@@ -1536,7 +1536,7 @@ void Debugger::ReportSymbolChange(const ModuleSpec &module_spec) {
std::lock_guard<std::recursive_mutex> guard(*g_debugger_list_mutex_ptr);
for (DebuggerSP debugger_sp : *g_debugger_list_ptr) {
EventSP event_sp = std::make_shared<Event>(
- Debugger::eBroadcastBitSymbolChange,
+ Debugger::eBroadcastBitSymbolFileChange,
new SymbolChangeEventData(debugger_sp, module_spec));
debugger_sp->GetBroadcaster().BroadcastEvent(event_sp);
}
@@ -1844,7 +1844,7 @@ lldb::thread_result_t Debugger::DefaultEventHandler() {
listener_sp->StartListeningForEvents(
&m_broadcaster, eBroadcastBitProgress | eBroadcastBitWarning |
- eBroadcastBitError | eBroadcastBitSymbolChange);
+ eBroadcastBitError | eBroadcastBitSymbolFileChange);
// Let the thread that spawned us know that we have started up and that we
// are now listening to all required events so no events get missed
diff --git a/lldb/source/Core/DebuggerEvents.cpp b/lldb/source/Core/DebuggerEvents.cpp
index dd77fff349a64a7..cd55352482b3db2 100644
--- a/lldb/source/Core/DebuggerEvents.cpp
+++ b/lldb/source/Core/DebuggerEvents.cpp
@@ -148,9 +148,12 @@ void SymbolChangeEventData::DoOnRemoval(Event *event_ptr) {
if (!module_sp->GetSymbolFileFileSpec())
module_sp->SetSymbolFileFileSpec(m_module_spec.GetSymbolFileSpec());
}
+
+ // This method is only calling SymbolsDidLoad to indicate that the symbol
+ // file in question has changed, so indicate that to SymbolsDidLoad
ModuleList module_list;
module_list.Append(module_sp);
- target_sp->SymbolsDidLoad(module_list);
+ target_sp->SymbolsDidLoad(module_list, Target::eBroadcastBitSymbolsChanged);
}
}
}
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index f5b551f581f9fdd..ed19b0f3263726d 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -66,6 +66,7 @@
#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/SetVector.h"
+#include <_types/_uint32_t.h>
#include <memory>
#include <mutex>
#include <optional>
@@ -1662,7 +1663,7 @@ void Target::ModulesDidLoad(ModuleList &module_list) {
}
}
-void Target::SymbolsDidLoad(ModuleList &module_list) {
+void Target::SymbolsDidLoad(ModuleList &module_list, uint32_t load_or_change_broadcast_bit) {
if (m_valid && module_list.GetSize()) {
if (m_process_sp) {
for (LanguageRuntime *runtime : m_process_sp->GetLanguageRuntimes()) {
@@ -1672,7 +1673,7 @@ void Target::SymbolsDidLoad(ModuleList &module_list) {
m_breakpoint_list.UpdateBreakpoints(module_list, true, false);
m_internal_breakpoint_list.UpdateBreakpoints(module_list, true, false);
- BroadcastEvent(eBroadcastBitSymbolsLoaded,
+ BroadcastEvent(load_or_change_broadcast_bit,
new TargetEventData(this->shared_from_this(), module_list));
}
}
diff --git a/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py b/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py
index 01b7d41f85c1185..d1db82cfd2cf5e1 100644
--- a/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py
+++ b/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py
@@ -58,27 +58,31 @@ def test_add_dsym_with_dSYM_bundle(self):
self.do_add_dsym_with_dSYM_bundle(self.exe_name)
@no_debug_info_test
- def test_report_symbol_change(self):
- """Test that when adding a symbol file, the eBroadcastBitSymbolChange event gets broadcasted."""
+ def test_report_symbol_load(self):
+ """Test that when adding a symbol file, the eBroadcastBitSymbolsLoaded event gets broadcasted."""
self.generate_main_cpp(version=1)
self.build(debug_info="dsym")
- self.exe_name = "a.out"
-
- # Get the broadcaster and listen for the symbol change event
- self.broadcaster = self.dbg.GetBroadcaster()
- self.listener = lldbutil.start_listening_from(
- self.broadcaster, lldb.SBDebugger.eBroadcastBitSymbolChange
+ listener = lldb.SBListener("listener")
+ listener.StartListeningForEventClass(
+ self.dbg,
+ lldb.SBTarget.GetBroadcasterClassName(),
+ lldb.SBTarget.eBroadcastBitSymbolsLoaded,
)
+
+ self.exe_name = "a.out"
+
# Add the dSYM
self.do_add_dsym_with_success(self.exe_name)
# Get the next event
- event = lldbutil.fetch_next_event(self, self.listener, self.broadcaster)
+ # event = lldbutil.fetch_next_event(self, self.listener, self.broadcaster)
+ event = lldb.SBEvent()
+ listener.WaitForEvent(1, event)
# Check that the event is valid
- self.assertTrue(event.IsValid(), "Got a valid eBroadcastBitSymbolChange event.")
+ self.assertTrue(event.IsValid(), "Got a valid eBroadcastBitSymbolsLoaded event.")
def generate_main_cpp(self, version=0):
>From e39095be80624114a487b8859644e45faac74971 Mon Sep 17 00:00:00 2001
From: Chelsea Cassanova <chelsea_cassanova at apple.com>
Date: Wed, 13 Sep 2023 18:46:02 -0700
Subject: [PATCH 3/4] fixup! fixup! [lldb][Commands] Show symbol change bit in
SB API
---
lldb/include/lldb/Target/Target.h | 1 -
lldb/source/Commands/CommandObjectTarget.cpp | 2 +-
lldb/source/Target/Target.cpp | 1 -
lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py | 5 -----
4 files changed, 1 insertion(+), 8 deletions(-)
diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h
index b479229417b3b23..eeb247987a7d561 100644
--- a/lldb/include/lldb/Target/Target.h
+++ b/lldb/include/lldb/Target/Target.h
@@ -9,7 +9,6 @@
#ifndef LLDB_TARGET_TARGET_H
#define LLDB_TARGET_TARGET_H
-#include <_types/_uint32_t.h>
#include <list>
#include <map>
#include <memory>
diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp
index 8051b3826294ab3..5f9bf6d5f14575f 100644
--- a/lldb/source/Commands/CommandObjectTarget.cpp
+++ b/lldb/source/Commands/CommandObjectTarget.cpp
@@ -4212,7 +4212,7 @@ class CommandObjectTargetSymbolsAdd : public CommandObjectParsed {
// currently loaded
ModuleList module_list;
module_list.Append(module_sp);
- target->SymbolsDidLoad(module_list);
+ target->SymbolsDidLoad(module_list, Target::eBroadcastBitSymbolsLoaded);
// Make sure we load any scripting resources that may be embedded
// in the debug info files in case the platform supports that.
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index ed19b0f3263726d..c28d942ba0c688d 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -66,7 +66,6 @@
#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/SetVector.h"
-#include <_types/_uint32_t.h>
#include <memory>
#include <mutex>
#include <optional>
diff --git a/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py b/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py
index d1db82cfd2cf5e1..540cb98265be39c 100644
--- a/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py
+++ b/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py
@@ -70,21 +70,16 @@ def test_report_symbol_load(self):
lldb.SBTarget.eBroadcastBitSymbolsLoaded,
)
-
- self.exe_name = "a.out"
-
# Add the dSYM
self.do_add_dsym_with_success(self.exe_name)
# Get the next event
- # event = lldbutil.fetch_next_event(self, self.listener, self.broadcaster)
event = lldb.SBEvent()
listener.WaitForEvent(1, event)
# Check that the event is valid
self.assertTrue(event.IsValid(), "Got a valid eBroadcastBitSymbolsLoaded event.")
-
def generate_main_cpp(self, version=0):
"""Generate main.cpp from main.cpp.template."""
temp = os.path.join(self.getSourceDir(), self.template)
>From 677f4b572ef4d24f69e932d63ca88d44b17876d8 Mon Sep 17 00:00:00 2001
From: Chelsea Cassanova <chelsea_cassanova at apple.com>
Date: Thu, 14 Sep 2023 13:34:12 -0700
Subject: [PATCH 4/4] fixup! fixup! fixup! [lldb][Commands] Show symbol change
bit in SB API
---
.../commands/add-dsym/uuid/TestAddDsymCommand.py | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py b/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py
index 540cb98265be39c..d8e78fcc1b49226 100644
--- a/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py
+++ b/lldb/test/API/commands/add-dsym/uuid/TestAddDsymCommand.py
@@ -71,6 +71,7 @@ def test_report_symbol_load(self):
)
# Add the dSYM
+ self.exe_name = "a.out"
self.do_add_dsym_with_success(self.exe_name)
# Get the next event
@@ -80,6 +81,20 @@ def test_report_symbol_load(self):
# Check that the event is valid
self.assertTrue(event.IsValid(), "Got a valid eBroadcastBitSymbolsLoaded event.")
+ # Check that there were modules reported with the event
+ num_modules = lldb.SBTarget.GetNumModulesFromEvent(event)
+ self.assertTrue(
+ num_modules > 0, "At least one module was reported with the eBroadcastBitSymbolsLoaded event"
+ )
+
+ # Check that all modules are valid
+ for x in range(num_modules):
+ current_module = lldb.SBTarget.GetModuleAtIndexFromEvent(x, event)
+ self.assertTrue(
+ current_module.IsValid(),
+ "Module %s from event eBroadcastBitSymbolsLoaded is valid." % current_module.GetFileSpec().GetFilename()
+ )
+
def generate_main_cpp(self, version=0):
"""Generate main.cpp from main.cpp.template."""
temp = os.path.join(self.getSourceDir(), self.template)
More information about the lldb-commits
mailing list