valgrind
valgrind使用
1.下载安装valgrind
sudo apt-get update; sudo apt-get install valgrind
2.运行valgrind
valgrind --leak-check=full --show-reachable=yes --log-file=/home/valgrind.log --num-callers=20 --tool=memcheck ./a.out
--tool=memcheck //使用valgrind的memcheck功能监测内存问题
-show-reachable=yes //是否检测控制范围之外的泄漏,比如全局指针、static指针等
--log-file=xxx.log //结果输出到文件
--leak-check=full //显示具体代码中泄漏的地方
--num-callers=20
3.监测的内存问题
1)使用未初始化的内存
2)内存读写越界
3)内存覆盖
4)动态内存管理错误
5)内存泄露
valgrind详细的监测原理、常见内存问题以及log分析参考如下博客
https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/
https://www.cnblogs.com/AndyStudy/p/6409287.html
https://www.linuxidc.com/Linux/2012-06/63754.htm
Memcheck
最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc、free、new、delete的调用都会被捕获。所以,它能检测以下问题:
1、对未初始化内存的使用;
2、读/写释放后的内存块;
3、读/写超出malloc分配的内存块;
4、读/写不适当的栈中内存块;
5、内存泄漏,指向一块内存的指针永远丢失;
6、不正确的malloc/free或new/delete匹配;
7、memcpy()相关函数中的dst和src指针重叠。
分析日志关键字:
1. Invalid write of size 4 // 内存越界
2. Source and destination overlap in memcpy(0x41a602c, 0x41a6028, 5) // 踩内存
3. Invalid free() / delete / delete[] // 重复释放
4. Use of uninitialised value of size 4 // 非法指针
5. Process terminating with default action of signal 11 (SIGSEGV) //由于非法指针赋值导致的程序崩溃
6. Syscall param write(buf) points to uninitialised byte //由于对齐等原因,我们定义变量等时应该先用memset对其进行初始化。然后再进行write、fwrite等调用。https://blog.csdn.net/zhang2010kang/article/details/47165801
7. Conditional jump or move depends on uninitialised value(s) //使用未初始化的值 https://blog.csdn.net/u010168781/article/details/83749609
8. definitely // 内存泄漏相关关键字