[Lldb-commits] [lldb] [lldb][windows] Keep int3 breakpoints inside the debugger on lldb-server (PR #197669)

via lldb-commits lldb-commits at lists.llvm.org
Thu May 14 05:22:32 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lldb

Author: Charles Zablit (charles-zablit)

<details>
<summary>Changes</summary>

`NativeProcessWindows::OnDebugException` forwarded `STATUS_BREAKPOINT` exceptions, which returned `ExceptionResult::SendToApplication` on first chance.

On Windows an unhandled `STATUS_BREAKPOINT` is fatal to the process. Programs containing explicit `int3`, `__debugbreak()`, or `__builtin_debugtrap()` were killed when hitting the instruction and the subsequent user `continue` had nothing to resume.

This patch mirrors the `ProcessWindows` plugin handling of `EXCEPTION_BREAKPOINT`. It fixes all shell `Register/*-read.test` / `*-write.test` cases and several expression side-effect tests in `check-lldb` with `LLDB_USE_LLDB_SERVER=1`.

---
Full diff: https://github.com/llvm/llvm-project/pull/197669.diff


1 Files Affected:

- (modified) lldb/source/Plugins/Process/Windows/Common/NativeProcessWindows.cpp (+12-1) 


``````````diff
diff --git a/lldb/source/Plugins/Process/Windows/Common/NativeProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/Common/NativeProcessWindows.cpp
index c5698b1a8368d..3e546bbd7d10a 100644
--- a/lldb/source/Plugins/Process/Windows/Common/NativeProcessWindows.cpp
+++ b/lldb/source/Plugins/Process/Windows/Common/NativeProcessWindows.cpp
@@ -564,7 +564,18 @@ NativeProcessWindows::OnDebugException(bool first_chance,
       return ExceptionResult::BreakInDebugger;
     }
 
-    [[fallthrough]];
+    // Any remaining STATUS_BREAKPOINT is a breakpoint instruction in the
+    // program's own code (e.g. `__debugbreak()` or `__builtin_debugtrap()`).
+    // Stop the debugger and let the user decide what to do.
+    std::string desc =
+        formatv("Exception {0} encountered at address {1}",
+                llvm::format_hex(record.GetExceptionCode(), 8),
+                llvm::format_hex(record.GetExceptionAddress(), 8))
+            .str();
+    StopThread(record.GetThreadID(), StopReason::eStopReasonException,
+               std::move(desc));
+    SetState(eStateStopped, true);
+    return ExceptionResult::MaskException;
   default:
     LLDB_LOG(log,
              "Debugger thread reported exception {0:x} at address {1:x} "

``````````

</details>


https://github.com/llvm/llvm-project/pull/197669


More information about the lldb-commits mailing list