[Lldb-commits] [lldb] [lldb][Windows] Dump thread stacks before lit's timeout kills a test (PR #213239)
Charles Zablit via lldb-commits
lldb-commits at lists.llvm.org
Fri Jul 31 03:36:36 PDT 2026
https://github.com/charles-zablit created https://github.com/llvm/llvm-project/pull/213239
On Windows, when a test hits a timeout, we currently don't get a stacktrace. dotest solves this on POSIX: it registers a SIGTERM handler, so a killed test prints its stack. The handler does not run on Windows however because `faulthandler.register` doesn't exist there, and lit terminates the process instead of signalling it (no signals on Windows).
This patch adds `faulthandler.dump_traceback_later()` with a default timeout value of 300s. That's longer than the longest test in CI (~150s) and does not kill the test. It simply dumps the stacktrace at a point where the test is very likely stuck.
# Before
```
TIMEOUT: lldb-api :: types/TestFloatTypesExpr.py (2698 of 2698)
******************** TEST 'lldb-api :: types/TestFloatTypesExpr.py' FAILED ********************
Exit Code: 15
Timeout: Reached timeout of 900 seconds
```
There is no stacktrace.
# After
```
Timeout (0:00:20)!
Thread 0x00012fe8 (most recent call first):
File ".../types/TestFloatTypesExpr.py", line 22 in test_float_type
File ".../lldbsuite/test/lldbtest.py", line 2097 in test_method
File ".../unittest/case.py", line 549 in _callTestMethod
...
File ".../lldbsuite/test/dotest.py", line 1212 in run_suite
```
>From c9328894f9f598158357fee314aa89b06705f0eb Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Fri, 31 Jul 2026 12:31:33 +0200
Subject: [PATCH] [lldb][Windows] Dump thread stacks before lit's timeout kills
a test
---
lldb/packages/Python/lldbsuite/test/dotest.py | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/lldb/packages/Python/lldbsuite/test/dotest.py b/lldb/packages/Python/lldbsuite/test/dotest.py
index 604fb98b1e2e5..3c966dceb96c7 100644
--- a/lldb/packages/Python/lldbsuite/test/dotest.py
+++ b/lldb/packages/Python/lldbsuite/test/dotest.py
@@ -504,6 +504,19 @@ def registerFaulthandler():
if getattr(faulthandler, "register", None):
faulthandler.register(signal.SIGTERM, chain=True)
+ if sys.platform != "win32":
+ return
+
+ # lit kills a hung test with TerminateProcess on Windows, so the SIGTERM
+ # handler above never runs and a timeout is reported with no indication of
+ # where it hung. Dump every thread's stack while the process is still alive.
+ try:
+ secs = float(os.environ.get("LLDB_TEST_STACK_DUMP_SECS", 300))
+ except ValueError:
+ secs = 300
+ if secs > 0:
+ faulthandler.dump_traceback_later(secs, exit=False)
+
def setupSysPath():
"""
More information about the lldb-commits
mailing list