我正在尝试查看哪个进程导致内存泄漏,并转储导致它的堆以查看问题所在。
我在 gdb 中使用哪个命令来设置内存泄漏并检查堆?
我尝试过:
(gdb) check -leaks
checkpoint: can't find fork function in inferior.
(gdb) help info heap
Undefined info command: "heap". Try "help info".
(gdb) help info leaks
Undefined info command: "leaks". Try "help info".
Valgrind 是您的答案,正如人们指出的那样。通常,Valgrind 只会在程序执行结束时报告错误。您可以将 Valgrind 与 GDB (
vgdb
) 链接起来,以便在程序在 GDB 下运行时在执行期间转储 Valgrind 统计信息。
参考类似问题:
info leaks
和 info heap
是仅在 HP-UX 上的 gdb 中可用的命令(HP-UX gdb 是开源 GNU 调试器 gdb 的定制版本,在 The HP Wildebeest Debugger (WDB)
- http://www.gdb.org/gdb 上调用)。 hp.com/go/wdb)。在 Linux 上,您需要使用 valgrind
。
如果您正在寻找如何使用 gdb 检测内存泄漏,请使用 -fsanitize=address 标志进行编译
int main() {
auto p = new int(5);
return 0;
}
==3891==错误:LeakSanitizer:检测到内存泄漏
从以下位置分配的 1 个对象中直接泄漏 4 个字节: #0 0x7f57658821c7 在运算符 new(无符号长) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:99 主目录中的#1 0x55fe1e16627e (/home/a.out+0x127e) #2 __libc_start_call_main 中的 0x7f5764a85d8f ../sysdeps/nptl/libc_start_call_main.h:58
摘要:AddressSanitizer:1 次分配中泄漏了 4 个字节。
修复:添加
delete p;