[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