Re: Still seeing Failed assertion: "p[i] == 0" on armv7 buildworld
Mark Millard <[email protected]>
| Newsgroups | gmane.os.freebsd.devel.arm,gmane.os.freebsd.current |
|---|---|
| Message-ID | <[email protected]> |
On Nov 14, 2025, at 07:25, bob prohaska <[email protected]> wrote: > On Thu, Nov 13, 2025 at 11:16:56PM -0800, Carl Shapiro wrote: >> bob prohaska <[email protected]> writes: >> >>> All the assertion failures I've seen have been in the clang libraries during >>> buildworld. They appear to happen in a variety of cases, indicated by the >>> different .sh and .cpp filenames found in the files under >>> http://www.zefox.net/~fbsd/assertion_failure/ >> >> Do you have the stdout and stderr of the build somewhere in there as >> well? The make(1) invocation in the readme file shows its output being >> redirected to a file. > > Those files have been overwritten by restarting the buildworld sessions. > They tend to be large and diffcult to synchronize with the .cpp and .sh > files generated by the crash. It could be done if it's useful. > >> >> The assert you mentioned in the subject of your e-mail message, which I >> also saw in the readme file, could come from jemalloc. See these lines >> of code for the context >> >> https://github.com/facebook/jemalloc/blob/dev/src/extent.c#L805-L814 >> >> That assertion will be tripped when jemalloc sees non-zero memory that >> it expects to be zeroed. See for example >> >> https://github.com/facebook/jemalloc/blob/dev/src/pages.c#L55-L106 >> >> Looking at the code, my hypothesis would be that jemalloc thinks it's >> committing memory for the first time but the memory is coming back with >> non-zero data. >> >> Just curious, but is over-commit enabled on your system? Here is the >> signal jemalloc is using to check >> >> https://github.com/facebook/jemalloc/blob/dev/src/pages.c#L729-L737 >> > > Sysctl -a reports in part: > # sysctl -a | grep -i overcommit > sysctl: S_vmtotal 48 != 88 The s_vmtotal line above is from what sysctl vm.vmtotal would report: output for "System wide totals computed every five seconds". That S_vmtotal line reported is a internal warning from sysctl. The 88 is correct and is sizeof(struct vmtotal) from sys/sys/vmmeter.h : (kgdb) ptype /o *(struct vmtotal*)0 /* offset | size */ type = struct vmtotal { /* 0 | 8 */ uint64_t t_vm; /* 8 | 8 */ uint64_t t_avm; /* 16 | 8 */ uint64_t t_rm; /* 24 | 8 */ uint64_t t_arm; /* 32 | 8 */ uint64_t t_vmshr; /* 40 | 8 */ uint64_t t_avmshr; /* 48 | 8 */ uint64_t t_rmshr; /* 56 | 8 */ uint64_t t_armshr; /* 64 | 8 */ uint64_t t_free; /* 72 | 2 */ int16_t t_rq; /* 74 | 2 */ int16_t t_dw; /* 76 | 2 */ int16_t t_pw; /* 78 | 2 */ int16_t t_sl; /* 80 | 2 */ int16_t t_sw; /* 82 | 6 */ uint16_t t_pad[3]; /* total size (bytes): 88 */ } The 48 is wrong for what the internal sysctl(. . .) returned. The message also indicates that the normal assocaited output was not generated for vm.vmtotal . I do not know if the error is somehow associated with your overlarge swap space (if you still have that). In my context "sysctl vm.vmtotal" and "sysctl -a" are working normally. > vm.overcommit: 0 "man 7 tuning" reports about vm.overcommit : The vm.overcommit sysctl defines the overcommit behaviour of the vm subsystem. The virtual memory system always does accounting of the swap space reservation, both total for system and per-user. Corresponding values are available through sysctl vm.swap_total, that gives the total bytes available for swapping, and vm.swap_reserved, that gives number of bytes that may be needed to back all currently allocated anonymous memory. Setting bit 0 of the vm.overcommit sysctl causes the virtual memory system to return failure to the process when allocation of memory causes vm.swap_reserved to exceed vm.swap_total. Bit 1 of the sysctl enforces RLIMIT_SWAP limit (see getrlimit(2)). Root is exempt from this limit. Bit 2 allows to count most of the physical memory as allocatable, except wired and free reserved pages (accounted by vm.stats.vm.v_free_target and vm.stats.vm.v_wire_count sysctls, respectively). > # > It's unclear if this implies yes or no, or even is the correct test. > >>> The failures are random in the sense that restarting buildworld either >>> produces a new assertion failure in a different library or completion. >>> >>> It isn't obvious how to capture a stack trace, if you can provide guidance >>> I'll give it a try. As is, buildworld simply stops, the machine does not >>> crash. >> >> It might be captured for you already? I noticed files with names >> containing "symbolizer-input" and "symbolizer-ouput" like this one >> >> http://www.zefox.net/~fbsd/assertion_failure/hostname_pelorus.zefox.org/symbolizer-output-7282d9 >> >> and the output files contain a stack trace like this >> >> llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) >> /usr/src/contrib/llvm-project/llvm/lib/Support/Unix/Signals.inc:731:7 >> >> llvm::sys::RunSignalHandlers() >> /usr/src/contrib/llvm-project/llvm/lib/Support/Signals.cpp:0:5 >> >> SignalHandler >> /usr/src/contrib/llvm-project/llvm/lib/Support/Unix/Signals.inc:0:3 >> >> handle_signal >> /usr/src/lib/libthr/thread/thr_sig.c:0:3 >> >> Any idea who or what is creating those files and when? > > The files are deposited in /tmp, apparently by the C compiler as records > of an internal error in the compiler, usually number 134. My understanding > is superficial at best. === Mark Millard marklmi at yahoo.com