[Lldb-commits] [lldb] bd586dd - [lldb] Use the standard GDB remote thread for a non-Wasm process (#214380)

via lldb-commits lldb-commits at lists.llvm.org
Thu Aug 6 09:51:17 PDT 2026


Author: Jonas Devlieghere
Date: 2026-08-06T09:51:12-07:00
New Revision: bd586dd26e3ba49616175c14cb2970c581fb94b7

URL: https://github.com/llvm/llvm-project/commit/bd586dd26e3ba49616175c14cb2970c581fb94b7
DIFF: https://github.com/llvm/llvm-project/commit/bd586dd26e3ba49616175c14cb2970c581fb94b7.diff

LOG: [lldb] Use the standard GDB remote thread for a non-Wasm process (#214380)

CanDebug returns true whenever the plugin is requested by name, and the
architecture is not known until the stub reports it after connecting.
This means that a non-Wasm process can end up with a ThreadWasm whose
register context and unwinder have nothing to operate on.

Create the plain ThreadGDBRemote once the architecture is known, and add
a helper so that the check covers wasm64 as well as wasm32.

rdar://182229301

Added: 
    

Modified: 
    lldb/source/Plugins/Process/wasm/ProcessWasm.cpp
    lldb/source/Plugins/Process/wasm/ThreadWasm.cpp
    lldb/test/API/functionalities/gdb_remote_client/TestWasm.py

Removed: 
    


################################################################################
diff  --git a/lldb/source/Plugins/Process/wasm/ProcessWasm.cpp b/lldb/source/Plugins/Process/wasm/ProcessWasm.cpp
index e119b3e3ecf6d..f7d744c967ea0 100644
--- a/lldb/source/Plugins/Process/wasm/ProcessWasm.cpp
+++ b/lldb/source/Plugins/Process/wasm/ProcessWasm.cpp
@@ -73,8 +73,7 @@ bool ProcessWasm::CanDebug(lldb::TargetSP target_sp,
 
   if (Module *exe_module = target_sp->GetExecutableModulePointer()) {
     if (ObjectFile *exe_objfile = exe_module->GetObjectFile())
-      return exe_objfile->GetArchitecture().GetMachine() ==
-             llvm::Triple::wasm32;
+      return exe_objfile->GetArchitecture().GetTriple().isWasm();
   }
 
   // However, if there is no wasm module, we return false, otherwise,
@@ -83,6 +82,9 @@ bool ProcessWasm::CanDebug(lldb::TargetSP target_sp,
 }
 
 std::shared_ptr<ThreadGDBRemote> ProcessWasm::CreateThread(lldb::tid_t tid) {
+  if (!GetTarget().GetArchitecture().GetTriple().isWasm())
+    return ProcessGDBRemote::CreateThread(tid);
+
   return std::make_shared<ThreadWasm>(*this, tid);
 }
 

diff  --git a/lldb/source/Plugins/Process/wasm/ThreadWasm.cpp b/lldb/source/Plugins/Process/wasm/ThreadWasm.cpp
index c7c05cb815261..bbf474906806d 100644
--- a/lldb/source/Plugins/Process/wasm/ThreadWasm.cpp
+++ b/lldb/source/Plugins/Process/wasm/ThreadWasm.cpp
@@ -20,8 +20,7 @@ using namespace lldb_private::wasm;
 
 Unwind &ThreadWasm::GetUnwinder() {
   if (!m_unwinder_up) {
-    assert(CalculateTarget()->GetArchitecture().GetMachine() ==
-           llvm::Triple::wasm32);
+    assert(CalculateTarget()->GetArchitecture().GetTriple().isWasm());
     m_unwinder_up.reset(new wasm::UnwindWasm(*this));
   }
   return *m_unwinder_up;

diff  --git a/lldb/test/API/functionalities/gdb_remote_client/TestWasm.py b/lldb/test/API/functionalities/gdb_remote_client/TestWasm.py
index 114ddd7adce5a..4e4a21d9416b1 100644
--- a/lldb/test/API/functionalities/gdb_remote_client/TestWasm.py
+++ b/lldb/test/API/functionalities/gdb_remote_client/TestWasm.py
@@ -501,3 +501,52 @@ def test_read_global(self):
         # Likewise for a global that does not exist.
         process.ReadMemory(globals_addr + 99, 4, error)
         self.assertFalse(error.Success())
+
+    @skipIfXmlSupportMissing
+    def test_non_wasm_process(self):
+        """Test that the plugin falls back to plain GDB remote debugging when
+        it is requested by name for a process that isn't WebAssembly."""
+
+        class NonWasmResponder(MockGDBServerResponder):
+            def qHostInfo(self):
+                return "triple:%s;ptrsize:8;endian:little;" % hex_encode_bytes(
+                    "x86_64-unknown-linux-gnu"
+                )
+
+            def qfThreadInfo(self):
+                return "m1"
+
+            def haltReason(self):
+                return "T02thread:1;threads:1;thread-pcs:10001bc00;"
+
+            def qXferRead(self, obj, annex, offset, length):
+                if annex == "target.xml":
+                    return (
+                        """<?xml version="1.0"?>
+                        <target version="1.0">
+                          <architecture>i386:x86-64</architecture>
+                          <feature name="org.gnu.gdb.i386.core">
+                            <reg name="rip" bitsize="64" regnum="0" type="code_ptr" group="general"/>
+                          </feature>
+                        </target>""",
+                        False,
+                    )
+                return None, False
+
+        self.server.responder = NonWasmResponder()
+
+        target = self.dbg.CreateTarget("")
+        process = self.connect(target, "wasm")
+        lldbutil.expect_state_changes(
+            self, self.dbg.GetListener(), process, [lldb.eStateStopped]
+        )
+
+        self.assertEqual(process.GetPluginName(), "wasm")
+        self.assertIn("x86_64", target.GetTriple())
+
+        thread = process.GetThreadAtIndex(0)
+        self.assertTrue(thread.IsValid())
+        self.assertEqual(thread.GetFrameAtIndex(0).GetPC(), 0x10001BC00)
+        self.assertNotIn(
+            "qWasmCallStack", "".join(self.server.responder.packetLog.get_received())
+        )


        


More information about the lldb-commits mailing list