g++编译时加入-g(注意在编译程序的时候加上-g选项,打印错误信息的时候会给出行号。):
编译之前先修改Makefile:
all : debug
如果还是release的话,报错会显示不出行
然后编译:
g++ -g main.cpp -o test
产生可执行文件
valgrind源码安装:
下载:https://sourceware.org/pub/valgrind/valgrind-3.17.0.tar.bz2
bunzip2 valgrind-3.17.0.tar.bz2
sudo tar -xvf valgrind-3.17.0.tar
cd valgrind-3.17.0
./configure
make -j16
sudo make install
加入环境变量
vim ~/.bashrc
将 export PATH=${PATH}:/usr/local/valgrind/bin 加入到最后一行
激活环境变量
source ~/.bashrc
即可使用 valgrind 了
输入命令查看你的valgrind是否正常:
valgrind ls -l
一、内存泄漏检测:
不保存日志:
valgrind --leak-check=full --show-reachable=yes --track-origins=yes -v ./可执行文件 参数
--leak-check=full指的是完全检查内存泄漏
--show-reachable=yes是显示内存泄漏的地点
--track-origins=yes查看未初始化的来源
保存日志:
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --track-origins=yes --log-file=memchk.log -v ./可执行文件 参数
一些输出解读:
内存读写越界:
Invalid write of size 4 或者 Invalid read of size 1
踩内存:
Source and destination overlap in memcpy(0x41a602c, 0x41a6028, 5)
重复释放:
Invalid free() / delete / delete[]
非法指针:
Use of uninitialised value of size 4
由于非法指针赋值导致的程序崩溃:
Process terminating with default action of signal 11 (SIGSEGV)
二、性能检测(调优)
valgrind --tool=callgrind -v ./可执行文件 参数
输出 callgrind.out.PID 文件
双击打开,如提示需要安装文件则安装
一般检测泄露的方法:
1、用valgrind检测泄漏的具体位置,然后改正(一般只修改 definitely lost),改正完再用valgrind检测
2、如果还有泄漏,但是分析不出明确原因,长时间跑一下(比如半天,一天等),看看是否有内存持续增加的现象(原因:valgrind有时候有误报)
3、补充:gdb是调试程序找bug的,功能强大,远胜windows的vs系列调试
更多资料:
Linux/C++ segment default错误 double free or corruption - 简书
Linux下几款C++程序中的内存泄露检查工具 - 小小鸟儿! - 博客园
double free or corruption错误定位_手边笔记-CSDN博客
关于C,C++的内存问题的定位 - LyndonYoung - 博客园
辅助类的方法 https://www.jb51.net/article/207085.htm
mtrace方法 Linux C / C++ 编程检查内存泄露的方法 – 悟能
refer:
Valgrind 使用入门 - 云+社区 - 腾讯云
linux下利用valgrind工具进行内存泄露检测和性能分析_yanghao23的专栏-CSDN博客_valgrind分析
valgrind工具使用详解_高司机的专栏-CSDN博客_valgrind工具
Valgrind
more refer:
C/C++的内存泄漏检测工具Valgrind memcheck的使用经历_三少GG-CSDN博客
more more:
Linux下几款C++程序中的内存泄露检查工具_u012662731的博客-CSDN博客_linux查看内存泄露工具
在 Linux 平台中调试 C/C++ 内存泄漏方法(转) - the_tops - 博客园
今日头条
如何在linux下检测内存泄漏 - Splace - 博客园
Linux 下几款程序内存泄漏检查工具_mlove编程-CSDN博客_linux内存泄露工具
C++内存泄露检查的5个方法_We_are_family678的博客-CSDN博客_c++检查内存泄露
C++内存泄漏检测_ShaYx1991的博客-CSDN博客
【转】C/C++内存泄漏及检测 - 阿玛尼迪迪 - 博客园
C++内存泄漏检测工具-Valgrind使用简介_wu_cai_的专栏-CSDN博客_内存泄漏工具
Linux下几款C++程序中的内存泄露检查工具_OSKernelLAB(gatieme)-CSDN博客_内存泄露检测工具