valgrind安装及使用
valgrind介绍
Valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,用于构建动态分析工具的装备性框架。它包括一个工具集,每个工具执行某种类型的调试、分析或类似的任务,以帮助完善你的程序。Valgrind的架构是模块化的,所以可以容易的创建新的工具而又不会扰乱现有的结构。
Valgrind包括如下一些工具
Memcheck。检查程序中的内存问题,如泄漏、越界、非法指针等
Callgrind。它主要用来检查程序中函数调用过程中出现的问题。
Cachegrind。分析CPU的cache命中率、丢失率,用于进行代码优化。
Helgrind。它主要用来检查多线程程序中出现的竞争问题。
Massif。它主要用来检查程序中堆栈使用中出现的问题。
Extension。可以利用core提供的功能,自己编写特定的内存调试工具
valgrind安装
1.valgrind下载:

http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2

下载好之后在虚拟机文件里面创建一个文件夹,我这里命名为valgrind,将上面下载好的安装包复制在里面。
请添加图片描述
请添加图片描述
快捷键Ctrl+Alt+t
输入cd valgrind
enter
2.valgrind安装:

tar -jxvf valgrind-3.12.0.tar.bz2
cd valgrind-3.12.0
./configure
make
sudo make install

下面进行详细讲解
Valgrind 工具详解
memcheck
最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc、free、new、delete的调用都会被捕获。
用法:

valgrind—tool=mencheck ./程序名

注意 :mencheck后面有一个空格
可以检测的问题
1、使用未初始化的内存。
2、读/写释放后的内存块;
3、内存读写越界(数组访问越界/访问已经释放的内存),读/写超出malloc分配的内存块;
4、读/写不适当的栈中内存块;
5、内存泄漏,指向一块内存的指针永远丢失;
6、不正确的malloc/free或new/delete匹配(重复释放/使用不匹配的分配和释放函数);
7、内存覆盖,memcpy()相关函数中的dst和src指针重叠

使用valgrind来对内存泄漏进行检测,
valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --undef-value-errors=no --log-file=log ./可执行文件名
在log文件最后会有个summary,其中对内存泄露进行了分类,总共有五类:
(1)“definitely lost” 意味着你的程序一定存在内存泄露;
(2)”indirectly lost”意味着你的程序一定存在内存泄露,并且泄露情况和指针结构相关
(3) “possibly lost” 意味着你的程序一定存在内存泄露,除非你是故意进行着不符合常规的操作,例如将指针指向某个已分配内存块的中间位置。
(4) “still reachable” 意味着你的程序可能是没问题的,但确实没有释放掉一些本可以释放的内存。这种情况是很常见的,并且通常基于合理的理由。
(5)”suppressed” 意味着有些泄露信息被压制了。在默认的 suppression 文件中可以看到一些 suppression 相关设置。

其中,如果二叉树的根节点被判定为”definitely lost”,则其所有子节点将被判定为”indirectly lost”,而如果你正确修复了类型为 “definitely lost” 的根节点泄露,那么类型为 “indirectly lost” 的子节点泄露也会随着消失。

对于如上图所示的情况,posslbly lost其实并没有造成内存上的影响,如果想要过滤掉该类报告信息,可以加入--show-possibly-lost=no ,而对于”still reachable” ,同样可以通过--show-reachable=yes来控制是否输出相应的信息。

如果某些需要的库没有找到,用指令

export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH

举个例子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Cachegrind
用法:valgrind –tool=cachegrind ./程序名
下面内容转载于https://blog.csdn.net/qq_33336155/article/details/52608383
大家可以去看看
Valgrind 使用
用法: valgrind [options]prog-and-args [options]:常用选项,适用于所有Valgrind工具

  1. -tool=最常用的选项。运行valgrind中名为toolname的工具。默认memcheck。
  2. h –help显示帮助信息。
  3. -version显示valgrind内核的版本,每个工具都有各自的版本。
  4. q –quiet安静地运行,只打印错误信息。
  5. v –verbose更详细的信息,增加错误数统计。
  6. -trace-children=no|yes跟踪子线程? [no]
  7. -track-fds=no|yes跟踪打开的文件描述?[no]
  8. -time-stamp=no|yes增加时间戳到LOG信息? [no]
  9. -log-fd=输出LOG到描述符文件 [2=stderr]
  10. -log-file=将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID
  11. -log-file-exactly=输出LOG信息到 file
  12. -log-file-qualifier=取得环境变量的值来做为输出信息的文件名。 [none]
  13. -log-socket=ipaddr:port输出LOG到socket ,ipaddr:port
    LOG信息输出
  14. -xml=yes将信息以xml格式输出,只有memcheck可用
  15. -num-callers= show callersin stack traces [12]
  16. -error-limit=no|yes如果太多错误,则停止显示新错误? [yes]
  17. -error-exitcode=如果发现错误则返回错误代码 [0=disable]
  18. -db-attach=no|yes当出现错误,valgrind会自动启动调试器gdb。[no]
  19. -db-command=启动调试器的命令行选项[gdb -nw %f %p]
    适用于Memcheck工具的相关选项:
  20. -leak-check=no|summary|full要求对leak给出详细信息? [summary]
  21. -leak-resolution=low|med|high how much bt merging in leakcheck [low]
    -show-reachable=no|yesshow reachable blocks in leak check? [no]
    编写示例代码main.c,前面数字为行号。
    1 int main()
    2 {
    3 int * pArray =malloc(sizeof(int) * 5);
    4
    5 pArray[5] = 1;
    6
    7
    8 int * pInt ;
    9
    10 int x = *pInt;
    11
    12 * pInt = 2;
    13
    14 return 0;
    15 }
    编译 gcc -g -otest main.c
    呈现编译时一定要增加-g参数,以添加调试信息,这样memcheck的错误信息可以精确到行。
    检测:valgrind–leak-check=yes ./test (//后红色字体是后加的解释语句)

30407 Memcheck,a memory error detector //30407进程号,不必关心

30407 Copyright© 2002-2015, and GNU GPL’d, by Julian Seward et al.

30407 Using Valgrind-3.11.0and LibVEX; rerun with -h for copyright info

30407 Command:./test

30407

30407 Invalidwrite of size 4 //四字节的非法写

30407 at 0x804845C: main (main.c:5) //代码位置,第5行,即pArray[5] = 1;

30407 Address 0x41ce03c is 0 bytes after a block ofsize 20 alloc’d

          //内存位置:20个字节后第0个字节,即pArray[5]数组末尾处。

30407 at 0x402BBC9: malloc(vg_replace_malloc.c:299)

30407 by 0x8048450: main (main.c:3)

30407

30407 Use ofuninitialised value of size 4 //四字节的未初始化内存被使用

30407 at 0x8048466: main (main.c:10) //代码位置,第10行,即int x = *pInt;

30407

30407 Use ofuninitialised value of size 4 //四字节的未初始化内存被使用

30407 at 0x8048470: main (main.c:12) //代码位置,第12行,即* pInt = 2;

30407

30407

30407 Processterminating with default action of signal 11 (SIGSEGV): dumping core //非法指针导致呈现崩溃

30407 Bad permissions for mapped region at address0x804848B

30407 at 0x8048470: main (main.c:12) //具体位置,12行。

30407

30407 HEAPSUMMARY:

30407 in use at exit: 20 bytes in 1 blocks

  // 20个bytes,未free,即数组pArray。

30407 total heap usage: 1 allocs, 0 frees, 20bytes allocated

30407

30407 LEAKSUMMARY:

30407 definitely lost: 0 bytes in 0 blocks

30407 indirectly lost: 0 bytes in 0 blocks

30407 possibly lost: 0 bytes in 0 blocks

30407 still reachable: 20 bytes in 1 blocks

30407 suppressed: 0 bytes in 0 blocks

30407 Reachableblocks (those to which a pointer was found) are not shown.

30407 To seethem, rerun with: --leak-check=full --show-leak-kinds=all

30407

30407 Forcounts of detected and suppressed errors, rerun with: -v

30407 Use–track-origins=yes to see where uninitialised values come from

30407 ERRORSUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)

Segmentation fault

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐