调试环境搭建:
根据这个回答Include source code of malloc.c in gdb?,下载源码用GDB调试。也可以到bminor/glibc上下载想要的其他版本源码。
这里所用的glibc 版本:glibc-2.31
根据gdb-onlinedocs-Preprocessor Macros,我们现在编译带调试信息的动态库(关键是宏扩展):
目录结构是:
源码存放在glibc-2.31文件里面。GNU C Library不能在源码的文件里面编译,只能创建一个单独的文件。
The GNU C Library cannot be compiled in the source directory. You must build it in a separate build directory.
z1933@1933:~/Downloads
$ ls -la
drwxr-xr-x 70 z1933 z1933 4096 Jun 8 19:31 glibc-2.31
drwxrwxr-x 62 z1933 z1933 4096 Jul 16 11:00 glibc-build
drwxrwxr-x 8 z1933 z1933 4096 Jun 8 20:23 glibc-install
$ pwd
/home/z1933/Downloads/glibc-build
# 生成makefile
$ ../glibc-2.31/configure --prefix=/home/z1933/Downloads/glibc-install/ CFLAGS='-gdwarf-2 -g3 -O'
# 开始编译,安装到对应目录
$ make all && make install
–prefix表示glibc库的安装目录(make install),安装好后在/home/z1933/Downloads/glibc-install/
就有我们需要的libc-2.31.so动态库了。
在glibc-build目录生成的makefile中可以把下面这个注释掉来多线程编译:
# Uncomment the line below if you want to do parallel build.
PARALLELMFLAGS = -j 4
具体关于如何编译,可以看下载的glibc源码文件中的INSTALL
文件。现在用环境变量使动态链接器优先链接我们的带调试信息的malloc。
$ export LD_PRELOAD=/home/z1933/Downloads/glibc-install/lib/libc-2.31.so
$ ldd first_fit
linux-vdso.so.1 (0x00007ffff7fcd000)
/home/z1933/Downloads/glibc-install/lib/libc-2.31.so (0x00007ffff7dd6000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fcf000)
在gdb里面需要:
(gdb) dir /usr/src/glibc/glibc-2.31/malloc/
Now I want to marry gdb:
现在可以在动态运行的时候展开一些宏。
┌──malloc.c───────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 1795 for (i = 1; i < NBINS; ++i) │
│ 1796 { │
│ 1797 bin = bin_at (av, i); │
│ 1798 bin->fd = bin->bk = bin; │
│ 1799 } │
│ 1800 │
│ 1801 #if MORECORE_CONTIGUOUS │
│ 1802 if (av != &main_arena) │
│ 1803 #endif │
│b+ 1804 set_noncontiguous (av); │
│ 1805 if (av == &main_arena) │
│ >1806 set_max_fast (DEFAULT_MXFAST); │
│ 1807 atomic_store_relaxed (&av->have_fastchunks, false); │
│ 1808 │
│ 1809 av->top = initial_top (av); │
│ 1810 } │
│ 1811 │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
native process 418301 In: ptmalloc_init L1806 PC: 0x7ffff7e74f15
$6 = 128
(gdb) p DEFAULT_MXFAST
+p DEFAULT_MXFAST
$7 = 128
(gdb) macro expand set_max_fast (DEFAULT_MXFAST)
+macro expand set_max_fast (DEFAULT_MXFAST)
expands to: global_max_fast = ((((64 * (sizeof (size_t)) / 4)) == 0) ? (__builtin_offsetof (struct malloc_chunk, fd_nex
tsize)) / 2 : (((64 * (sizeof (size_t)) / 4) + (sizeof (size_t))) & ~((2 * (sizeof (size_t)) < __alignof__ (long double
) ? __alignof__ (long double) : 2 * (sizeof (size_t))) - 1)))
(gdb)
关于malloc源码分析,毛遂自荐一下:Understanding the heap by debugging it