There was a mistake in the diff. From: Masato Asou <a...@soum.co.jp> Date: Fri, 08 Sep 2023 05:33:23 +0900 (JST)
> Hi, > > I have modified diff. comments, ok? > > $ MALLOC_OPTIONS=D ktrace -tu ./a.out 1073490000 > a.out(99781) in unknown(): putleakinfo(): Cannot allocate memory > -- > ASOU Masato > > Index: stdlib/malloc.c > =================================================================== > RCS file: /cvs/src/lib/libc/stdlib/malloc.c,v > retrieving revision 1.289 > diff -u -p -r1.289 malloc.c > --- stdlib/malloc.c 30 Jun 2023 06:24:58 -0000 1.289 > +++ stdlib/malloc.c 7 Sep 2023 20:30:01 -0000 > @@ -344,6 +344,22 @@ wrterror(struct dir_info *d, char *msg, > } > > static void > +wrtwarning(char *func, char *msg, ...) > +{ > + int saved_errno = errno; > + va_list ap; > + > + dprintf(STDERR_FILENO, "%s(%d) in %s(): ", __progname, > + getpid(), func == NULL ? func : "unknown"); func != NULL ? func : "unknown" I will take a break and re-create the diff. -- ASOU Masato > + va_start(ap, msg); > + vdprintf(STDERR_FILENO, msg, ap); > + va_end(ap); > + dprintf(STDERR_FILENO, "\n"); > + > + errno = saved_errno; > +} > + > +static void > rbytes_init(struct dir_info *d) > { > arc4random_buf(d->rbytes, sizeof(d->rbytes)); > @@ -2353,8 +2369,11 @@ putleakinfo(struct leaktree *leaks, void > if (page == NULL || > used >= MALLOC_PAGESIZE / sizeof(struct leaknode)) { > page = MMAP(MALLOC_PAGESIZE, 0); > - if (page == MAP_FAILED) > + if (page == MAP_FAILED) { > + wrtwarning(f, "%s(): %s", __func__, > + strerror(errno)); > return; > + } > used = 0; > } > p = &page[used++]; > > From: Otto Moerbeek <o...@drijf.net> > Date: Thu, 7 Sep 2023 12:43:04 +0200 > >> 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++]; >>> >> >