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++];
>