valgrind:内存泄漏 memory leak 调试教程

1.安装

sudo apt install valgrind # 如果找不到,先运行 sudo apt update

2.运行程序

//程序不带参数运行
valgrind --tool=memcheck --leak-check=full --log-file=/home/administrator/workspace/planning/mem_debug.txt ./output/bin/control

//程序带参数运行
valgrind --tool=memcheck --leak-check=full --log-file=/home/administrator/workspace/control/mem_debug.txt ./output/bin/control  --control_conf_file=/home/administrator/workspace/control/output/conf/control/control_conf_RX.pb.txt --vehicle_config_path=/home/administrator/.airs/data/conf/RX-001/vehicle_param.pb.txt --control_calibration_file=/home/administrator/.airs/data/conf/RX-001/calibration_table.pb.txt 

待程序启动后,检查终端中打印的调试信息,看是否出现”malloc/new“等类似的关键字,则相关信息一般都和内存分配有关,再结合代码仔细排查

3、程序结束

  • 一般程序是开启线程循环执行,不会自动结束,若直接在terminal使用ctrl+c或kill -9 <pid> 结束程序,valgrind来不及统计内存泄露相关信息,无法得到完成报告;

  • 可使用如下命令结束程序,可获得完整的valgrind报告:

    # 使用top 或 ps 命令获取程序pid
    kill -TERM <pid>

4. 参考文档

Using Valgrind to Find Memory Leaks - Cprogramming.com

Valgrind参数配置详解_听雨时节的博客-CSDN博客_valgrind 参数

 使用 Valgrind 检测 C++ 内存泄漏 | Senlin's Blog

【Linux】Valgrind工具集详解_熠熠微光的博客-CSDN博客_linux valgrind

DEBUG神器valgrind之memcheck报告分析_学之之博未若知之之要知之之要未若行之之实的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用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` 函数调用的位置。现在,我们可以检查这个函数调用的原因,并修复程序中的错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值