注意:
1、二进制文件不能strip
2、二进制文件最好使用-g
3、官方文档valgrind:http://valgrind.org/docs/download_docs.html,这是其官方帮助文档,比较全面
valgrind --tool=memcheck --leak-check=full ./x86_joseph_qrcode
usage
- x86 平台
- 先编译你自己的应用程序
- 命令行:
- valgrind --log-file=1 --tool=memcheck ./a.out
error specification
一、有malloc,但未free
- code
<span style="font-family:Courier New;font-size:10px;">#include <stdio.h> #include <stdlib.h> void main() { char *p = malloc(20); sprintf(p, "%s", "test"); fprintf(stderr, "p:%s/n", p); } </span>
- 分析:
- 文件后部,总体来看,有确定无疑的lost 20字节。如下:
<span style="font-family:Courier New;font-size:10px;">==26512== LEAK SUMMARY: ==26512== definitely lost: 20 bytes in 1 blocks. </span>
- 在文件之前描述的内容,细节可以看出,有1个malloc,但未去free。如下:
<span style="font-family:Courier New;font-size:10px;">==26512== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 1) ==26512== malloc/free: in use at exit: 20 bytes in 1 blocks. ==26512== malloc/free: 1 allocs, 0 frees, 20 bytes allocated. </span>
- 文件后部,总体来看,有确定无疑的lost 20字节。如下:
二、free一个未malloc的指针
- code
<span style="font-family:Courier New;font-size:10px;">void main() { char p[] = "hello"; fprintf(stderr, "p:%s/n", p); free(p); } </span>
- 分析:
- 文件后部,总体来看,有1个错误,0个malloc,1个free。如下:
<span style="font-family:Courier New;font-size:10px;">==26786== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1) ==26786== malloc/free: in use at exit: 0 bytes in 0 blocks. ==26786== malloc/free: 0 allocs, 1 frees, 0 bytes allocated. </span>
- 在文件之前描述的内容,细节可以看出,有一个无效的free。如下:
<span style="font-family:Courier New;font-size:10px;">==26786== Invalid free() / delete / delete[] ==26786== at 0x402265C: free (vg_replace_malloc.c:323) ==26786== by 0x804841F: main (in /home/yutao/test/a.out) </span>
- 文件后部,总体来看,有1个错误,0个malloc,1个free。如下:
三、stack中,无效的读取,不会提示出错
- code
<span style="font-family:Courier New;font-size:10px;">void main() { char p[8] = "hello"; //p在栈上, "hello"在常量区 fprintf(stderr, "p10:%c/n", p[10]); } </span>
- 分析:
- 读取stack栈中的内容,不会提示错误