kpdev42 created this revision. kpdev42 added reviewers: clayborg, davide, k8stone, DavidSpickett. kpdev42 added a project: LLDB. Herald added a subscriber: JDevlieghere. Herald added a project: All. kpdev42 requested review of this revision. Herald added a subscriber: lldb-commits.
Before this patch, lldb did not send signal filtering information (QPassSignals packet) to lldb-server on remote platforms until signal settings were explicitly changed. Patch changes last sent signals version to be initialized with an invalid value instead of 0, so that the signal filtering information is sent to the server when the version is actually 0, which happens on remote platforms when the signal structure is copied and the version is reset. Also changes Process so that the information is sent not only right after launch, but right after attach too to be more consistent. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D144390 Files: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h lldb/source/Target/Process.cpp lldb/test/API/functionalities/gdb_remote_client/TestGDBRemoteSignalFiltering.py Index: lldb/test/API/functionalities/gdb_remote_client/TestGDBRemoteSignalFiltering.py =================================================================== --- /dev/null +++ lldb/test/API/functionalities/gdb_remote_client/TestGDBRemoteSignalFiltering.py @@ -0,0 +1,31 @@ +"""Test that GDBRemoteProcess sends default signal filtering info when necessary""" + +import lldb +from lldbsuite.test.lldbtest import * +from lldbsuite.test.decorators import * +from lldbsuite.test.gdbclientutils import * +from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase + + +class TestGDBRemoteSignalFiltering(GDBRemoteTestBase): + + def test_signals_sent_on_connect(self): + """Test that signal filtering info is sent on connect""" + class Responder(MockGDBServerResponder): + def qSupported(self, client_supported): + return "PacketSize=3fff;QStartNoAckMode+;QPassSignals+" + + def respond(self, packet): + if packet == "QPassSignals": + return self.QPassSignals() + return MockGDBServerResponder.respond(self, packet) + + def QPassSignals(self): + return "OK" + + self.server.responder = Responder() + target = self.createTarget("a.yaml") + process = self.connect(target) + self.assertGreater( + len([p for p in self.server.responder.packetLog if p.startswith("QPassSignals:")]), + 0) Index: lldb/source/Target/Process.cpp =================================================================== --- lldb/source/Target/Process.cpp +++ lldb/source/Target/Process.cpp @@ -2592,7 +2592,7 @@ if (!m_os_up) LoadOperatingSystemPlugin(false); - // We successfully launched the process and stopped, now it the + // We successfully launched the process and stopped, now it is the // right time to set up signal filters before resuming. UpdateAutomaticSignalFiltering(); return Status(); @@ -3026,6 +3026,10 @@ : "<none>"); } } + + // We successfully attached to the process and stopped, now it is the + // right time to set up signal filters before resuming. + UpdateAutomaticSignalFiltering(); } Status Process::ConnectRemote(llvm::StringRef remote_url) { Index: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h =================================================================== --- lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h +++ lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h @@ -420,7 +420,7 @@ // For ProcessGDBRemote only std::string m_partial_profile_data; std::map<uint64_t, uint32_t> m_thread_id_to_used_usec_map; - uint64_t m_last_signals_version = 0; + uint64_t m_last_signals_version = UINT64_MAX; static bool NewThreadNotifyBreakpointHit(void *baton, StoppointCallbackContext *context,
Index: lldb/test/API/functionalities/gdb_remote_client/TestGDBRemoteSignalFiltering.py =================================================================== --- /dev/null +++ lldb/test/API/functionalities/gdb_remote_client/TestGDBRemoteSignalFiltering.py @@ -0,0 +1,31 @@ +"""Test that GDBRemoteProcess sends default signal filtering info when necessary""" + +import lldb +from lldbsuite.test.lldbtest import * +from lldbsuite.test.decorators import * +from lldbsuite.test.gdbclientutils import * +from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase + + +class TestGDBRemoteSignalFiltering(GDBRemoteTestBase): + + def test_signals_sent_on_connect(self): + """Test that signal filtering info is sent on connect""" + class Responder(MockGDBServerResponder): + def qSupported(self, client_supported): + return "PacketSize=3fff;QStartNoAckMode+;QPassSignals+" + + def respond(self, packet): + if packet == "QPassSignals": + return self.QPassSignals() + return MockGDBServerResponder.respond(self, packet) + + def QPassSignals(self): + return "OK" + + self.server.responder = Responder() + target = self.createTarget("a.yaml") + process = self.connect(target) + self.assertGreater( + len([p for p in self.server.responder.packetLog if p.startswith("QPassSignals:")]), + 0) Index: lldb/source/Target/Process.cpp =================================================================== --- lldb/source/Target/Process.cpp +++ lldb/source/Target/Process.cpp @@ -2592,7 +2592,7 @@ if (!m_os_up) LoadOperatingSystemPlugin(false); - // We successfully launched the process and stopped, now it the + // We successfully launched the process and stopped, now it is the // right time to set up signal filters before resuming. UpdateAutomaticSignalFiltering(); return Status(); @@ -3026,6 +3026,10 @@ : "<none>"); } } + + // We successfully attached to the process and stopped, now it is the + // right time to set up signal filters before resuming. + UpdateAutomaticSignalFiltering(); } Status Process::ConnectRemote(llvm::StringRef remote_url) { Index: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h =================================================================== --- lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h +++ lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h @@ -420,7 +420,7 @@ // For ProcessGDBRemote only std::string m_partial_profile_data; std::map<uint64_t, uint32_t> m_thread_id_to_used_usec_map; - uint64_t m_last_signals_version = 0; + uint64_t m_last_signals_version = UINT64_MAX; static bool NewThreadNotifyBreakpointHit(void *baton, StoppointCallbackContext *context,
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits