ubuntu下Qt Creator使用valgrind检测内存泄漏

时间:2021-03-29 15:17:59

1.安装valgrind

sudo apt-get install valgrind

2. Valgrind的使用

为了使valgrind发现的错误更精确,如能够定位到源代码行,建议在编译时加上-g参数,编译优化选项请选择O0,虽然这会降低程序的执行效率。

这里用到的示例程序文件名为:test.c,选用的编译器为gcc。

生成可执行程序

gcc -g -O0 test.c -o test

生成可执行程序test之后,如何使用Valgrind来生成内存的记录文件呢?一般这样使用:

valgrind --leak-check=full --log-file=test_valgrind.log --num-callers=30 ./test
  • --log-file 后面的test_valgrind.log是指定生成的日志文件名称。

  • --num-callers 后面的60是生成的每个错误记录的追踪行数。30是随便设定的,如果没指定,默认是12行貌似(有可能有的追踪行就没显示)。

  • --leak-check=full 表示开启详细的内存泄露检测器。


ubuntu在终端检测C代码内存泄漏错误

C代码:

[cpp] view plain copy print?ubuntu下Qt Creator使用valgrind检测内存泄漏ubuntu下Qt Creator使用valgrind检测内存泄漏
  1. #include <stdlib.h>  
  2. int* func(void)  
  3. {  
  4.    int* x = malloc(10 * sizeof(int));  
  5.    x[0] = 0;  //问题1: 数组下标越界  
  6. }                   
  7.   
  8. int main(void)  
  9. {  
  10.     printf("abc\n");  
  11.   
  12.     int* x=NULL;  
  13.     x=func();  
  14.     free(x);   
  15.   
  16.      printf("cccc----\n");  
  17.   
  18.     x=NULL;  
  19.     return 0;   //问题2: 内存没有释放  
  20. }  

编译

gcc -g -o test test.c

 

内存检查
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./test

结果: [html] view plain copy print?ubuntu下Qt Creator使用valgrind检测内存泄漏ubuntu下Qt Creator使用valgrind检测内存泄漏
  1. XXXXXXXX@Mountain:~/C_Project$ valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./test  
  2. ==3361== Memcheck, a memory error detector  
  3. ==3361== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.  
  4. ==3361== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info  
  5. ==3361== Command: ./test  
  6. ==3361==   
  7. abc  
  8. ==3361== Invalid write of size 4  
  9. ==3361==    at 0x804842F: func (test.c:5)  
  10. ==3361==    by 0x8048458: main (test.c:12)  
  11. ==3361==  Address 0x41f2050 is 0 bytes after a block of size 40 alloc'd  
  12. ==3361==    at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)  
  13. ==3361==    by 0x8048425: func (test.c:4)  
  14. ==3361==    by 0x8048458: main (test.c:12)  
  15. ==3361==   
  16. cccc----  
  17. ==3361==   
  18. ==3361== HEAP SUMMARY:  
  19. ==3361==     in use at exit: 40 bytes in 1 blocks  
  20. ==3361==   total heap usage: 1 allocs, 0 frees, 40 bytes allocated  
  21. ==3361==   
  22. ==3361== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1  
  23. ==3361==    at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)  
  24. ==3361==    by 0x8048425: func (test.c:4)  
  25. ==3361==    by 0x8048458: main (test.c:12)  
  26. ==3361==   
  27. ==3361== LEAK SUMMARY:  
  28. ==3361==    definitely lost: 40 bytes in 1 blocks  
  29. ==3361==    indirectly lost: 0 bytes in 0 blocks  
  30. ==3361==      possibly lost: 0 bytes in 0 blocks  
  31. ==3361==    still reachable: 0 bytes in 0 blocks  
  32. ==3361==         suppressed: 0 bytes in 0 blocks  
  33. ==3361==   
  34. ==3361== For counts of detected and suppressed errors, rerun with: -v  
  35. ==3361== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)  
内存读写错误: [html] view plain copy print?ubuntu下Qt Creator使用valgrind检测内存泄漏ubuntu下Qt Creator使用valgrind检测内存泄漏
  1. ==3361== Invalid write of size 4  
  2. ==3361==    at 0x804842F: func (test.c:5)  

内存泄漏:

[html] view plain copy print?ubuntu下Qt Creator使用valgrind检测内存泄漏ubuntu下Qt Creator使用valgrind检测内存泄漏
  1. ==3361== LEAK SUMMARY:  
  2. ==3361==    definitely lost: 40 bytes in 1 blocks  
  3. ==3361==    indirectly lost: 0 bytes in 0 blocks  

当将错误修改后:的输出为:

[html] view plain copy print?ubuntu下Qt Creator使用valgrind检测内存泄漏ubuntu下Qt Creator使用valgrind检测内存泄漏
  1. XXXXXXX@Mountain:~/C_Project$ valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./test  
  2. ==3383== Memcheck, a memory error detector  
  3. ==3383== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.  
  4. ==3383== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info  
  5. ==3383== Command: ./test  
  6. ==3383==  
  7. abc  
  8. cccc----  
  9. ==3383==  
  10. ==3383== HEAP SUMMARY:  
  11. ==3383==     in use at exit: 0 bytes in 0 blocks  
  12. ==3383==   total heap usage: 1 allocs, 1 frees, 40 bytes allocated  
  13. ==3383==  
  14. ==3383== All heap blocks were freed -- no leaks are possible  
  15. ==3383==  
  16. ==3383== For counts of detected and suppressed errors, rerun with: -v  
  17. ==3383== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)  

很明显,已经没有错误了。


但是这里有一个问题,就是我们还无法判断内存具体泄漏的位置,待我研究后再修改此篇文章。