On Oct 19, 2006, at 9:23 AM, [EMAIL PROTECTED] wrote:
FreeBSD uses another malloc alternative where the data and the informations are splitted into two lists. The informations on sizes are stored in a page direcory list. Entries of that list point to their corresponding page with the data. My question is now, regarding on the usage of gdb: How can I find out, of what size a chunk is? Or, where do I find the page direcory list?

The PHK malloc implementation in /usr/src/lib/libc/stdlib/malloc.c declares the page directory to be static:

  static struct   pginfo **page_dir;

...either change this to make the symbol public, or perhaps add a _write in malloc_init() to output the location this structure:

% cp /usr/src/lib/libc/stdlib/malloc.c /tmp/malloc.c

Edit as you please, perhaps:

--- /tmp/malloc.c~      Thu Oct 19 17:50:25 2006
+++ /tmp/malloc.c       Thu Oct 19 17:50:30 2006
@@ -212,7 +212,7 @@
static u_long last_index;
/* Pointer to page directory. Allocated "as if with" malloc */
-static struct  pginfo **page_dir;
+struct pginfo **page_dir;
/* How many slots in the page directory */
static unsigned        malloc_ninfo;

% gcc -g -O -Wall -I/usr/src/lib/libc/include -shared -o /tmp/ malloc.so /tmp/malloc.c
% LD_PRELOAD=/tmp/malloc.so gdb /tmp/test
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-marcel-freebsd"...
(gdb) b malloc
Function "malloc" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (malloc) pending.
(gdb) run
Starting program: /tmp/test
Breakpoint 2 at 0x280793f6: file /tmp/malloc.c, line 1152.
Pending breakpoint "malloc" resolved

Breakpoint 2, malloc (size=10) at /tmp/malloc.c:1152
1152        return (pubrealloc(NULL, size, " in malloc():"));
(gdb) p page_dir
$1 = (struct pginfo **) 0x0
(gdb) n
1153    }
(gdb) p page_dir
$2 = (struct pginfo **) 0x2815d000

However, before you go this route, perhaps you ought to consider what problem you are actually trying to solve by doing this. :-)

You could always build and utilize the Linux malloc implementation, or jemalloc from -CURRENT, or even one of the debugging-friendly mallocs such as Doug Lea's in /usr/ports/devel/libdlmalloc instead...

--
-Chuck



_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "[EMAIL PROTECTED]"
  • chunk size Leidecker
    • Re: chunk size Chuck Swiger

Reply via email to