在 Linux 的 gdb 中启用 memleak 选项

问题描述 投票:0回答:3

我正在尝试查看哪个进程导致内存泄漏,并转储导致它的堆以查看问题所在。

我在 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".
c++ linux memory-leaks gdb
3个回答
12
投票

Valgrind 是您的答案,正如人们指出的那样。通常,Valgrind 只会在程序执行结束时报告错误。您可以将 Valgrind 与 GDB (

vgdb
) 链接起来,以便在程序在 GDB 下运行时在执行期间转储 Valgrind 统计信息。

参考类似问题:

转储 Valgrind 报告的丢失内存的内容


4
投票

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


0
投票

如果您正在寻找如何使用 gdb 检测内存泄漏,请使用 -fsanitize=address 标志进行编译

int main() {
    auto p = new int(5);
    return 0;
}
  • g++ -g app.cpp -fsanitize=地址
  • ./a.out

==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;
© www.soinside.com 2019 - 2024. All rights reserved.