GDB解析malloc.h数据结构时出现类型未知错误求助
解决GDB调试malloc内部结构的问题
1. 消除“Source file is more recent than executable”警告
这个警告是因为可执行文件生成时间早于源码文件,只需重新编译即可:
- 删除旧可执行文件:
rm heap_test - 重新编译时建议关闭优化(避免调试信息被优化丢失):
gcc -g -O0 -o heap_test heap_test.c
2. 解决GDB无法识别malloc内部符号的问题
mp_、main_arena属于glibc malloc的内部实现符号,并非公开API,即使代码包含<malloc.h>也无法让GDB自动识别其类型,以下是几种解决方法:
方法一:安装glibc调试信息包(推荐)
Red Hat Enterprise Linux 8上,安装glibc的调试包可让GDB自动识别这些内部结构的类型:
sudo dnf install glibc-debuginfo glibc-debuginfo-common
安装完成后重启GDB,执行p __libc_main_arena(RH8中main_arena的实际符号名是__libc_main_arena)即可正常查看结构;对于mp_,若指malloc参数结构,可尝试p __malloc_params。
方法二:手动在GDB中定义内部结构类型
若无法安装调试包,可手动在GDB中输入适配RH8 glibc版本的内部结构定义:
# 定义malloc_chunk结构 typedef struct malloc_chunk { unsigned long prev_size; unsigned long size; struct malloc_chunk* fd; struct malloc_chunk* bk; struct malloc_chunk* fd_nextsize; struct malloc_chunk* bk_nextsize; } malloc_chunk; # 定义malloc_state(main_arena的类型) typedef struct malloc_state { unsigned int mutex; int flags; struct malloc_chunk* fastbinsY[10]; struct malloc_chunk* top; struct malloc_chunk* last_remainder; struct malloc_chunk* bins[62]; unsigned int binmap[2]; struct malloc_state* next; struct malloc_state* next_free; unsigned long system_mem; unsigned long max_system_mem; } malloc_state;
定义完成后,通过强制类型转换查看:
p (malloc_state *)&__libc_main_arena
方法三:确认符号的正确名称
RH8的glibc中部分内部符号名称与预期不同:
- 不要直接用
p main_arena,实际导出符号是__libc_main_arena - 若
mp_指malloc参数结构,对应符号为__malloc_params
内容的提问来源于stack exchange,提问作者PARDEEP
相关产品推荐
相关产品推荐

