使用 Linux GDB 识别内存泄漏
摘要
本文档介绍如何在 Linux 上使用 GDB 跟踪内存泄漏。本文档适用于通过 malloc() 分配但未释放的内存块的内存泄漏问题。
正文
调试器运行速度较慢,可能会导致性能问题。如果可以通过 LD_PRELOAD 或其他方式覆盖默认的 malloc()/free() 例程,这可能比使用调试器更快且更简单。
注意:下面提供的 GDB 脚本可以根据需要进行修改。需记住,由于 GDB 版本、操作系统版本、编译选项等因素,可能会导致结果略有不同,因此应将此脚本视为一个基础,而不是在所有平台上对任何可执行文件都适用的通用解决方案。
首先,我们需要明确要做的事情:
- 每次进入 malloc() 时,应将请求分配的内存大小保存到一个变量中。
- 每次从 malloc() 返回时,应打印大小和从 malloc() 返回的地址。
- 每次进入 free() 时,应打印即将释放的指针。
由于我们不希望每次进行内存分配或释放时都手动与调试器交互,因此需要将命令放入脚本中,让 GDB 作为参数执行该脚本,无需任何手动干预。以下是脚本的示例以及典型的输出,并对脚本进行一些解释。
GDB 脚本 (gdbcmd1)
set pagination off
set breakpoint pending on
set logging file gdbcmd1.out
set logging on
hbreak malloc
commands
set $mallocsize = (unsigned long long) $rdi
continue
end
hbreak *(malloc+191)
commands
printf "malloc(%ld)=0x%016lx\n",$mall

最低0.47元/天 解锁文章
1595

被折叠的 条评论
为什么被折叠?



