Skip to content

std.debug: fix some corner cases #23927

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

rootbeer
Copy link
Contributor

Add infinite loop detection to the std.debug backtraces. Make the backtrace and stacktrace code more robust on corner-case architectures.

Expand the "unwind.zig" test case to exercise std.debug.dumpCurrentStackTrace(). And trigger a signal handler so the test can exercise std.debug.dumpStackTraceFromBase() and std.debug.StackIterator.initWithContext() using a kernel-constructed context.

This is preparation for moving std.debug away from getContext() (#23801).

@alexrp alexrp self-assigned this May 19, 2025
@rootbeer rootbeer force-pushed the debug-mcontext-stage1 branch from b95af2b to 37ebc96 Compare May 19, 2025 22:41
@rootbeer rootbeer marked this pull request as ready for review May 20, 2025 15:49
@rootbeer
Copy link
Contributor Author

This is ready for a review. I think the actual fixes are all straightforward, but the test is generating a lot of stderr spew (both from the dump-stack-trace functions being tested and my verbose std.debug.print logging. This all shows up in "passing" test output (e.g., https://github.com/ziglang/zig/actions/runs/15124641832/job/42514310709?pr=23927#step:3:2243). Is there something I can do in the build.zig to hide the stderr output when the test passes? Or should I remove my print statements? But, the dump-stack-trace functions are doing most of the logging (and I suspect its generally confusing to see stack traces in passing tests). Should I disable those? (The StackIterator testing covers the meat of the code, but it does seem like the complete routines should get some testing ...)

@alexrp
Copy link
Member

alexrp commented May 20, 2025

Is there something I can do in the build.zig to hide the stderr output when the test passes?

You can capture the output from the build script, e.g. by adding an "expected output" check. See for example #23892.

@rootbeer
Copy link
Contributor Author

@alexrp Thanks again for the reviews! One more question before I push a new version up: Should I make changes anywhere to get this test to compile/run against targets other than the default on CI?

@alexrp
Copy link
Member

alexrp commented May 20, 2025

I guess you could just change the test's build.zig to ignore the standard target option and instead build & run for a predefined set of targets? test/llvm_targets.zig is a good resource for a list of targets that are actually relevant/real (although some of them we obviously don't fully support yet).

@rootbeer rootbeer force-pushed the debug-mcontext-stage1 branch from 37ebc96 to 74336df Compare May 20, 2025 23:40
@rootbeer
Copy link
Contributor Author

You can capture the output from the build script, e.g. by adding an "expected output" check. See for example #23892.

Excellent! Done.

I guess you could just change the test's build.zig to ignore the standard target option and instead build & run for a predefined set of targets? test/llvm_targets.zig is a good resource for a list of targets that are actually relevant/real (although some of them we obviously don't fully support yet).

I'm going to postpone this for now. I don't want to disable the native testing, and don't really want to test a bunch of non-standard targets redundantly. I'll play around with this for future changes.

Two unrequested changes: (1) I got suspicious that the Darwin-aarch64 alignment hack-around in the test's signal handler was influencing other platforms, so I re-worked the code to more clearly do the hackery only when necessary.

@alexrp
Copy link
Member

alexrp commented May 21, 2025

Two unrequested changes: (1) I got suspicious that the Darwin-aarch64 alignment hack-around in the test's signal handler was influencing other platforms, so I re-worked the code to more clearly do the hackery only when necessary.

What's (2)? 👀 Also I'm not entirely sure which change you're referring to.

@rootbeer rootbeer force-pushed the debug-mcontext-stage1 branch from 74336df to 3447789 Compare May 21, 2025 16:17
@rootbeer
Copy link
Contributor Author

What's (2)? 👀 Also I'm not entirely sure which change you're referring to.

Oh lol ... I was planning on changing the verification steps in the test a bit, but undid that at the last moment. Didn't quite fix up the message here well enough.

So the only thing in this latest push that needs a quick review is the aarch64-darwin ctx-fixup code in the test's signal handler. (Though wait until the tests pass, of course ...)

@rootbeer rootbeer force-pushed the debug-mcontext-stage1 branch 2 times, most recently from 105abc5 to 679ac12 Compare May 21, 2025 19:27
This test creates three nested stack frames and then tests stack trace
creation.  Add some additional tests of stack traces by invoking
"dumpCurrentStackTrace()" and by using a signal handler's "context"
parameter to feed backtrace construction.

Make the test case at least runnable on a wide variety of systems
(including Windows, and WASI).  Because `ucontext_t` and `getcontext` are
not evenly supported everywhere, some systems are expected only get
through parts of the test.
@rootbeer rootbeer force-pushed the debug-mcontext-stage1 branch from 679ac12 to e965f5d Compare May 21, 2025 21:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants