C++内存泄漏分析
- vld vld_vs2019 vld_doc download gui DR
常用命令
- sudo apt-get install valgrind
- sudo apt-get install subversion && svn co svn://svn.valgrind.org/valgrind/trunk valgrind
- gcc test.c -g -o test #运行后,生成.out
- valgrind --suppressions=valgrind/runTest.sup --leak-check=full ./bin/runTest
- valgrind --leak-check=full --show-reachable=yes --trace-children=yes ./bin/runTest
- killall memcheck #守护进程泄漏检测
- killall callgrind #守护进程代码覆盖和性能瓶颈检测
- valgrind --tool=Memcheck(默认),callgrind,Addrcheck,Cachegrind,Helgrind(多线程分析),Massif(堆分析),DHAT,BBV ./bin/runTest #生成callgrind.out.pid
- callgrind_annotate --auto=yes callgrind.out.23202 >log #查看callgrind结果
- valgrind --tool=memcheck ls -l #命令内存检查
- –vgdb=yes,full --vgdb-error=0 --vgdb-stop-at=startup,exit,abexit,valgrindabexit #valgrind下gdb调试
- –log-file= #输出日志
- –run-cxx-freeres= #C++检测
- gdb prog && target remote | vgdb #开始gdb调试后,另shell远程gdb调试
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void f(void)
{
int* x = malloc(10 * sizeof(int));
x[10] = 0; // problem 1: heap block overrun
} // problem 2: memory leak – x not freed
void func() {
printf(“func call”);
func();
}
int main(int, int**) {
f();
//func();
printf(“hello\n”);
char *ptr = malloc(10);
ptr[12] = ‘a’;// 内存越界
memcpy(ptr+1, ptr, 5);// 踩内存
char a[10];
a[12] = ‘i’;// 数组越界
free(ptr);
free(ptr);// 重复释放
char *p1;
*p1 = ‘1’;// 非法指针
}