aboutsummaryrefslogtreecommitdiff
path: root/lib/std/debug.zig
AgeCommit message (Collapse)Author
2025-10-31std.os.windows: eliminate forwarder function in kernel32 (#25766)qilme
#1840 kernel32.AddVectoredExceptionHandler -> ntdll.RtlAddVectoredExceptionHandler kernel32.RemoveVectoredExceptionHandler -> ntdll.RtlRemoveVectoredExceptionHandler kernel32.ExitProcess -> ntdll.RtlExitUserProcess kernel32.InitializeCriticalSection -> ntdll.RtlInitializeCriticalSection kernel32.EnterCriticalSection -> ntdll.RtlEnterCriticalSection kernel32.LeaveCriticalSection -> ntdll.RtlLeaveCriticalSection kernel32.DeleteCriticalSection -> ntdll.RtlDeleteCriticalSection kernel32.TryAcquireSRWLockExclusive -> ntdll.RtlTryAcquireSRWLockExclusive kernel32.AcquireSRWLockExclusive -> ntdll.RtlAcquireSRWLockExclusive kernel32.ReleaseSRWLockExclusive -> ntdll.RtlReleaseSRWLockExclusive kernel32.WakeConditionVariable -> ntdll.RtlWakeConditionVariable kernel32.WakeAllConditionVariable -> ntdll.RtlWakeAllConditionVariable kernel32.HeapReAlloc -> ntdll.RtlReAllocateHeap kernel32.HeapAlloc -> ntdll.RtlAllocateHeap
2025-10-30std.debug.lockStderrWriter: also return ttyconfMatthew Lugg
`std.Io.tty.Config.detect` may be an expensive check (e.g. involving syscalls), and doing it every time we need to print isn't really necessary; under normal usage, we can compute the value once and cache it for the whole program's execution. Since anyone outputting to stderr may reasonably want this information (in fact they are very likely to), it makes sense to cache it and return it from `lockStderrWriter`. Call sites who do not need it will experience no significant overhead, and can just ignore the TTY config with a `const w, _` destructure.
2025-10-29Merge pull request #25592 from ziglang/init-std.IoAndrew Kelley
std: Introduce `Io` Interface
2025-10-29remove all IBM AIX and z/OS supportAlex Rønne Petersen
As with Solaris (dba1bf935390ddb0184a4dc72245454de6c06fd2), we have no way to actually audit contributions for these OSs. IBM also makes it even harder than Oracle to actually obtain these OSs. closes #23695 closes #23694 closes #3655 closes #23693
2025-10-29std: make signal numbers into an enumAndrew Kelley
fixes start logic for checking whether IO/POLL exist
2025-10-29std.Io.Threaded: add ioBasic which disables networkingAndrew Kelley
2025-10-29std: back out the StackTrace byval changesAndrew Kelley
Let's keep passing this thing by pointer
2025-10-29std: fix compilation errors on WindowsAndrew Kelley
2025-10-29std.Io: implement fileStatAndrew Kelley
2025-10-27remove all Oracle Solaris supportAlex Rønne Petersen
There is no straightforward way for the Zig team to access the Solaris system headers; to do this, one has to create an Oracle account, accept their EULA to download the installer ISO, and finally install it on a machine or VM. We do not have to jump through hoops like this for any other OS that we support, and no one on the team has expressed willingness to do it. As a result, we cannot audit any Solaris contributions to std.c or other similarly sensitive parts of the standard library. The best we would be able to do is assume that Solaris and illumos are 100% compatible with no way to verify that assumption. But at that point, the solaris and illumos OS tags would be functionally identical anyway. For Solaris especially, any contributions that involve APIs introduced after the OS was made closed-source would also be inherently more risky than equivalent contributions for other proprietary OSs due to the case of Google LLC v. Oracle America, Inc., wherein Oracle clearly demonstrated its willingness to pursue legal action against entities that merely copy API declarations. Finally, Oracle laid off most of the Solaris team in 2017; the OS has been in maintenance mode since, presumably to be retired completely sometime in the 2030s. For these reasons, this commit removes all Oracle Solaris support. Anyone who still wishes to use Zig on Solaris can try their luck by simply using illumos instead of solaris in target triples - chances are it'll work. But there will be no effort from the Zig team to support this use case; we recommend that people move to illumos instead.
2025-10-23std.debug: fix FP unwinding for hppa/hppa64Alex Rønne Petersen
2025-10-23std.debug: fix FP unwind progress check for stackGrowth() == .up targetsAlex Rønne Petersen
2025-10-23std.debug: FP unwinding is impossible on alpha, microblaze, shAlex Rønne Petersen
2025-10-19Merge pull request #25623 from alexrp/or1kAlex Rønne Petersen
Add `or1k-linux` support (via CBE)
2025-10-18fix(std): don't add the default `_start` and `panic` in homebrew targetsGasInfinity
* even if std supported those targets, they're not posixy to be in that codepath.
2025-10-18std.debug: fix frame pointer unwinding on or1kAlex Rønne Petersen
2025-10-18std.debug: FP-based unwinding is impossible on avr, csky, msp430, and xcoreAlex Rønne Petersen
The ABIs do not define a frame pointer register, nor do they define a guaranteed and fixed area on the stack where one might find saved registers such as a frame pointer or return address.
2025-10-15std.debug: FP-based unwinding is ideal on SPARCAlex Rønne Petersen
The way SPARC works due to its ABI built around register windows means that we can always do fast FP-based unwinding.
2025-10-15std.debug: fix return addresses being off on SPARCAlex Rønne Petersen
The return address points to the call instruction on SPARC, so the actual return address is 8 bytes after. This means that we shouldn't do the return address adjustment that we normally do.
2025-10-15std.debug: use the SP as the initial FP on SPARCAlex Rønne Petersen
The FP would point to the register save area for the previous frame, while the SP points to the register save area for the current frame. So use the latter.
2025-10-15std.debug: work around latest SPARC register window not being spilled on signalAlex Rønne Petersen
I have no idea if this is a QEMU bug or real kernel behavior. Either way, the register save area specifically exists for asynchronous spilling of incoming and local registers, so there should be no harm in doing this.
2025-10-15std.debug: the SPARC stack bias is only used on the 64-bit ABIAlex Rønne Petersen
2025-10-15std.debug: rename some constants for clarityAlex Rønne Petersen
2025-10-15std.debug: fix an invalid read in StackIterator.next()Alex Rønne Petersen
We're overwriting the memory that unwind_context sits in, so we need to do the getFp() call earlier.
2025-10-15std.debug.cpu_context.Sparc: flush register windows in current()Alex Rønne Petersen
It's better to do this here than in StackIterator.init() so that std.debug.cpu_context.Native.current() isn't a footgun on SPARC.
2025-10-15std.debug: flush SPARC register windows from a new windowAlex Rønne Petersen
flushw and ta 3 flush all windows *except* the current one. So we need to do this in a new register window to get all of the ones we care about.
2025-10-10Coff: implement threadlocal variablesJacob Young
2025-10-10std.debug: greatly expand target support for segfault handling/unwindingAlex Rønne Petersen
I made a couple of decisions for this based on the fact that we don't expose the signal_ucontext_t type outside of the file: * Adding all the floating point and vector state to every ucontext_t and mcontext_t variant was way, way too much work, especially when we don't even use the stuff. So I deleted all that and kept only the bare minimum needed to reach into general-purpose registers. * There is no particularly compelling reason to stick to the naming and struct nesting used in the system headers. So we can actually unify the access patterns for almost all of these variants by taking some liberties here; as a result, fromPosixSignalContext() is now much nicer to read and extend.
2025-10-09std.debug: fix FP unwinding for LoongArchAlex Rønne Petersen
2025-10-09std.debug: fix SelfInfo default for freestanding ELF targetsAlex Rønne Petersen
2025-10-09std.debug: fix incorrect FP unwinding on RISC-V and SPARCmlugg
I broke this when porting this logic for the `std.debug` rework in https://github.com/ziglang/zig/pull/25227. The offset that I copied was actually being treated as relative to the address of the *saved* base pointer. I think it makes more sense to do what I did and just treat all offsets as relative to this frame's base.
2025-10-07std.debug: add noinline to functions that capture the current stack traceAlex Rønne Petersen
Fixes stack traces missing a frame depending on inlining decisions. ref https://github.com/ziglang/zig/issues/25418
2025-10-07std.debug: prefer FP unwinding on targets where it is idealAlex Rønne Petersen
If the ABI requires a backchain pointer, FP unwinding is always possible, safe, and fast, so there's really no reason not to use it.
2025-10-05std.debug: completely disable FP-based unwinding on mipsAlex Rønne Petersen
2025-10-04Merge pull request #25457 from linusg/more-serenityAlex Rønne Petersen
std.debug: Add unwind support for serenity
2025-10-04std.debug: consider FP-based unwinding on hexagon and powerpc safeAlex Rønne Petersen
The ABIs make this safe and reliable due to their backchain requirements.
2025-10-04std.debug: fix FP-based unwinding on powerpc64Alex Rønne Petersen
This just needs to do the same thing as powerpc64le. Note that the saved LR is at the same position in both ELF v1 and v2.
2025-10-03std.debug: Add unwind support for serenityLinus Groh
2025-10-03std.debug: use correct return address offset for s390xAlex Rønne Petersen
Makes FP-based unwinding work.
2025-10-01std.debug.SelfInfo: rename Darwin to MachOAlex Rønne Petersen
2025-10-01std.debug: don't use SelfInfo.Windows for UEFIAlex Rønne Petersen
It is, in fact, Windows-only.
2025-10-01std.debug: select SelfInfo using ObjectFormat.default()Alex Rønne Petersen
2025-09-30std.debug.SelfInfo: remove shared logicmlugg
There were only a few dozen lines of common logic, and they frankly introduced more complexity than they eliminated. Instead, let's accept that the implementations of `SelfInfo` are all pretty different and want to track different state. This probably fixes some synchronization and memory bugs by simplifying a bunch of stuff. It also improves the DWARF unwind cache, making it around twice as fast in a debug build with the self-hosted x86_64 backend, because we no longer have to redundantly go through the hashmap lookup logic to find the module. Unwinding on Windows will also see a slight performance boost from this change, because `RtlVirtualUnwind` does not need to know the module whatsoever, so the old `SelfInfo` implementation was doing redundant work. Lastly, this makes it even easier to implement `SelfInfo` on freestanding targets; there is no longer a need to emulate a real module system, since the user controls the whole implementation! There are various other small refactors here in the `SelfInfo` implementations as well as in the DWARF unwinding logic. This change turned out to make a lot of stuff simpler!
2025-09-30std.debug: significantly speed up capturing stack tracesmlugg
By my estimation, these changes speed up DWARF unwinding when using the self-hosted x86_64 backend by around 7x. There are two very significant enhancements: we no longer iterate frames which don't fit in the stack trace buffer, and we cache register rules (in a fixed buffer) to avoid re-parsing and evaluating CFI instructions in most cases. Alongside this are a bunch of smaller enhancements, such as pre-caching the result of evaluating the CIE's initial instructions, avoiding re-parsing of CIEs, and big simplifications to the `Dwarf.Unwind.VirtualMachine` logic.
2025-09-30std.debug: cap total stack trace framesmlugg
...just in case there is broken debug info and/or bad values on the stack, either of which could cause stack unwinding to potentially loop forever.
2025-09-30std.debug.SelfInfo: thread safetymlugg
This has been a TODO for ages, but in the past it didn't really matter because stack traces are typically printed to stderr for which a mutex is held so in practice there was a mutex guarding usage of `SelfInfo`. However, now that `SelfInfo` is also used for simply capturing traces, thread safety is needed. Instead of just a single mutex, though, there are a couple of different mutexes involved; this helps make critical sections smaller, particularly when unwinding the stack as `unwindFrame` doesn't typically need to hold any lock at all.
2025-09-30std: don't get CPU context when using CBE targeting MSVCmlugg
Calling `current` here causes compilation failures as the C backend currently does not emit valid MSVC inline assembly. This change means that when building for MSVC with the self-hosted C backend, only FP unwinding can be used.
2025-09-30std.debug: go back to storing return addresses instead of call addressesmlugg
...and just deal with signal handlers by adding 1 to create a fake "return address". The system I tried out where the addresses returned by `StackIterator` were pre-subtracted didn't play nicely with error traces, which in hindsight, makes perfect sense. This definition also removes some ugly off-by-one issues in matching `first_address`, so I do think this is a better approach.
2025-09-30std: allow disabling stack tracingmlugg
This option disables both capturing and printing stack traces. The default is to disable if debug info is stripped.
2025-09-30std.debug: update support checksmlugg