Hi, I am using MALLOC_OPTIONS=D and kdump report no information when malloc() exceeds 1073500000 bytes on my OpenBSD box. I have investigated and found that mmap() faild in putleakinfo().
I used the following program: #include <err.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> int main(int argc, char *argv[]) { size_t size; void *buf; char *end; if (argc != 2) { fprintf(stderr, "usage: ./a.out size\n"); exit(1); } size = strtol(argv[1], &end, 0); if (argv[1] == end) { fprintf(stderr, "Invalid argument: %s\n", argv[1]); exit(1); } if (*end == 'k') size *= 1024; else if (*end == 'm') size *= 1024 * 1024; else if (*end == 'g') size *= 1024 * 1024 * 1024; if ((buf = malloc(size)) == NULL) err(1, "malloc"); return (0); } I used this program to perform the following: $ MALLOC_OPTIONS=D ktrace -tu ./a.out 1073490000 $ kdump -u malloc ******** Start dump a.out ******* M=8 I=1 F=0 U=0 J=1 R=0 X=0 C=0 cache=64 G=0 Leak report: f sum # avg 0xeb017e21c6f 1073490000 1 1073490000 addr2line -e ./a.out 0x1c6f ******** End dump a.out ******* $ MALLOC_OPTIONS=D ktrace -tu ./a.out 1073500000 $ kdump -u malloc $ ls -l ktrace.out -rw------- 1 asou asou 64 Sep 7 18:38 ktrace.out $ export LD_LIBRARY_PATH=/usr/obj/lib/libc $ MALLOC_OPTIONS=D ktrace -tu ./a.out 1073500000 /usr/src/lib/libc/stdlib/malloc.c: putleakinfo: Cannot allocate memory $ In such a case, shouldn't an error message be displayed? I made a patch for print error message if mmap() was failed. comments, ok? -- ASOU Masato Index: lib/libc/stdlib/malloc.c =================================================================== RCS file: /cvs/src/lib/libc/stdlib/malloc.c,v retrieving revision 1.289 diff -u -p -r1.289 malloc.c --- lib/libc/stdlib/malloc.c 30 Jun 2023 06:24:58 -0000 1.289 +++ lib/libc/stdlib/malloc.c 7 Sep 2023 09:44:59 -0000 @@ -2354,7 +2354,14 @@ putleakinfo(struct leaktree *leaks, void used >= MALLOC_PAGESIZE / sizeof(struct leaknode)) { page = MMAP(MALLOC_PAGESIZE, 0); if (page == MAP_FAILED) + { + char buf[256]; + + snprintf(buf, sizeof (buf), "%s: %s: %s\n", + __FILE__, __func__, strerror(errno)); + write(STDERR_FILENO, buf, strlen(buf)); return; + } used = 0; } p = &page[used++];