On Thu, Sep 07, 2023 at 06:45:55PM +0900, Masato Asou wrote: > 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'm ok with the general idea, but see inline > > > 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) > + { Brace should be after if (... ) > + char buf[256]; > + > + snprintf(buf, sizeof (buf), "%s: %s: %s\n", > + __FILE__, __func__, strerror(errno)); > + write(STDERR_FILENO, buf, strlen(buf)); > return; Please format the message to be like what wrterror() does (without the abort of ccurse), using dprintf(). -Otto > + } > used = 0; > } > p = &page[used++]; >