如何用gdb调试glibc源码

 

调试环境搭建:

根据这个回答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