如何用GDB进行内存泄漏调试?请举例
时间: 2023-12-14 20:36:41 浏览: 306
使用gdb进行调试 gdb
4星 · 用户满意度95%
使用GDB进行内存泄漏调试的基本步骤如下:
1. 在编译时加入 -g 选项,以便GDB能够读取符号表信息。
2. 启动程序并在GDB中设置断点,以便在程序运行到此处时停止。例如,可以在程序的 main 函数中设置断点。
3. 在GDB中运行程序,让程序执行到断点处停止。
4. 使用GDB的内存调试工具来检查程序是否有内存泄漏。例如,可以使用 GDB 的 `valgrind` 命令来检查程序内存的使用情况。
5. 如果发现内存泄漏,使用GDB的调试工具找出泄漏的位置和原因,并修复程序中的错误。
下面是一个简单的示例,展示了如何使用GDB和 `valgrind` 来检查内存泄漏:
```c++
#include <stdlib.h>
int main()
{
int* p = (int*) malloc(sizeof(int));
*p = 10;
return 0;
}
```
假设上述代码保存在文件 `test.c` 中,使用以下命令编译:
```
gcc -g -o test test.c
```
然后使用以下命令启动GDB:
```
gdb test
```
在GDB中设置断点:
```
break main
```
运行程序:
```
run
```
程序会在 `main` 函数中断下来。接下来,使用 `valgrind` 来检查内存泄漏:
```
valgrind ./test
```
`valgrind` 会输出以下信息:
```
==2833== Memcheck, a memory error detector
==2833== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2833== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==2833== Command: ./test
==2833==
==2833==
==2833== HEAP SUMMARY:
==2833== in use at exit: 4 bytes in 1 blocks
==2833== total heap usage: 1 allocs, 0 frees, 4 bytes allocated
==2833==
==2833== LEAK SUMMARY:
==2833== definitely lost: 4 bytes in 1 blocks
==2833== indirectly lost: 0 bytes in 0 blocks
==2833== possibly lost: 0 bytes in 0 blocks
==2833== still reachable: 0 bytes in 0 blocks
==2833== suppressed: 0 bytes in 0 blocks
==2833== Rerun with --leak-check=full to see details of leaked memory
==2833==
==2833== For counts of detected and suppressed errors, rerun with: -v
==2833== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
```
可以看到,`valgrind` 检测到了一个内存泄漏,程序在退出时仍然有4字节的内存没有释放。现在,我们可以使用GDB来找出哪里出了问题:
```
gdb test
```
在GDB中运行 `valgrind` 检测内存泄漏:
```
run --vgdb=yes
```
GDB会在程序启动后等待连接到 `valgrind`。在另一个终端窗口中,运行以下命令连接到GDB:
```
vgdb
```
然后在GDB中打印出内存泄漏的地址:
```
monitor leak_check -show-reachable=yes
```
GDB会输出以下信息:
```
==2833== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==2833== at 0x4C2AB80: malloc (vg_replace_malloc.c:299)
==2833== by 0x40054A: main (test.c:4)
```
可以看到,内存泄漏发生在第4行,也就是 `malloc` 函数调用的位置。现在,我们可以检查这个函数调用的原因,并修复程序中的错误。
阅读全文