valgrind内存泄漏检测

版权声明:如无允许,请勿转载 https://blog.csdn.net/agq358/article/details/90020595

g++编译时加入-g(注意在编译程序的时候加上-g选项,打印错误信息的时候会给出行号。):
编译之前先修改Makefile:
all : debug
如果还是release的话,报错会显示不出行
然后编译:
g++ -g main.cpp -o test

产生可执行文件

一、内存泄漏检测:

valgrind --tool=memcheck --leak-check=full --show-reachable=yes --track-origins=yes --log-file=memchk.log ./可执行文件 参数
--tool=memcheck 表示使用工具集中的内存检测
--leak-check=full指的是完全检查内存泄漏
--show-reachable=yes是显示内存泄漏的地点
--track-origins=yes查看未初始化的来源
--trace-children=yes是跟入子进程(暂时没加过)

查看生成的日志:
vi memchk.log

日志一些输出解读:
内存读写越界:
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系列调试

扫描二维码关注公众号,回复: 6241640 查看本文章

refer:

https://cloud.tencent.com/developer/article/1006199

https://blog.csdn.net/yanghao23/article/details/7514587

https://blog.csdn.net/pbymw8iwm/article/details/42522407

http://valgrind.org/docs/manual/manual-core.html#manual-core.options

enjoy yourself .☺

猜你喜欢

转载自blog.csdn.net/agq358/article/details/90020595