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

Reply via email to