栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux下valgrind认识

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux下valgrind认识

说明:
  本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
  QQ 群 号:513683159 【相互学习】
内容来源:
  The Valgrind Quick Start Guide
  Valgrind User Manual
  如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测
  Valgrind学习总结
  专注于中台化代码生成器
  valgrind 工具介绍和简单的使用
  valgrind简介与使用

介绍:

  valgrind工具是一种用于构建动态分析工具的工具框架。它附带了一组工具,每个工具都执行某种类型的调试、分析或类似任务,以帮助您改进程序。有以下工具(标准):
  ① Memcheck:内存错误检测器,可使程序更正确(特别是:C、C++程序)
  ② Cachegrind:缓存和分支预测分析器,可使程序运行得更快。
  ③ Callgrind:生成调用图的缓存分析器,与Cachegrind有一些重叠,但也收集了一些Cachegrind没有收集的信息。
  ④ Helgrind:线程错误检测器,可使多线程程序更正确。
  ⑤ DRD:线程错误检测器,与Helgrind类似,但使用了不同的分析技术,因此可能会发现不同的问题
  ⑥ Massif:堆分析器,可使程序使用更少的内存
  ⑦ DHAT:不同的堆分析器,可帮助理解区块生存期、区块利用率和布局效率低下的问题。
  ⑧ BBV:实验性SimPoint基本块向量发生器,对计算机体系结构的研究和开发有一定的参考价值。
  还有一些其他的小工具,用的最多的应该是:Memcheck。

准备工作:

  1.安装valgrind工具:
    ①更新软件源:sudo apt-get update
    ②安装valgrind:sudo apt-get install valgrind
  2.编译程序:
    ①编译需添加选项-g,包含调试信息,使Memcheck的错误消息包含确切的行号。
    ②编译优化选项选择-O0,其他可能造成一些错误。

举例:

  1️⃣创建文件:myprog.c,文件内容如下:

#include 

void f(void)
{
   int* x = malloc(10 * sizeof(int));
   x[10] = 0;        // problem 1: heap block overrun
}                    // problem 2: memory leak -- x not freed

int main(void)
{
   f();
   return 0;
}

  该程序有两个错误:
    ①内存错误,数组越界,访问x[10],最大是x[9]
    ②内存泄漏,内存泄露,没有free
  2️⃣编译程序:gcc myprog.c -o myprog -g -O0,生成myprog可执行文件.
  3️⃣运行程序:./myprog arg1 arg2
    没有任何反应。
  4️⃣启动Memcheck运行程序:valgrind --leak-check=yes ./myprog arg1 arg2
    结果如下:

==4131== Memcheck, a memory error detector
==4131== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==4131== Using Valgrind-3.17.0 and LibVEX; rerun with -h for copyright info
==4131== Command: ./myprog arg1 arg2
==4131== 
==4131== Invalid write of size 4
==4131==    at 0x10916B: f (myprog.c:6)
==4131==    by 0x109180: main (myprog.c:11)
==4131==  Address 0x4a55068 is 0 bytes after a block of size 40 alloc'd
==4131==    at 0x4842839: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==4131==    by 0x10915E: f (myprog.c:5)
==4131==    by 0x109180: main (myprog.c:11)
==4131== 
==4131== 
==4131== HEAP SUMMARY:
==4131==     in use at exit: 40 bytes in 1 blocks
==4131==   total heap usage: 1 allocs, 0 frees, 40 bytes allocated
==4131== 
==4131== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4131==    at 0x4842839: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==4131==    by 0x10915E: f (myprog.c:5)
==4131==    by 0x109180: main (myprog.c:11)
==4131== 
==4131== LEAK SUMMARY:
==4131==    definitely lost: 40 bytes in 1 blocks
==4131==    indirectly lost: 0 bytes in 0 blocks
==4131==      possibly lost: 0 bytes in 0 blocks
==4131==    still reachable: 0 bytes in 0 blocks
==4131==         suppressed: 0 bytes in 0 blocks
==4131== 
==4131== For lists of detected and suppressed errors, rerun with: -s
==4131== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

  5️⃣错误消息分析:
    ①==4131==为进程ID。
    ②Invalid write of size 4:无效写,这边由于堆块溢出,程序写到了一些它不应该拥有的内存中。
    ③at 0x10916B: f (myprog.c:6)堆栈跟踪,告诉问题在哪里。
      0x10916B为代码地址,通常不重要但在跟踪更奇怪的错误至关重要。
    ④HEAP SUMMARY:堆总结。
    ⑤LEAK SUMMARY:泄露总结,其中最重要两类:
      definitely lost:肯定失去
      possibly lost:可能失去

直接打印到屏幕

  指令:valgrind --tool=memcheck --leak-check=full ./可执行文件名

将报错信息存入valgrind_report.log文件中

内容来源:linux C valgrind使用

  指令:valgrind --log-file=./valgrind_report.log --leak-check=full --show-leak-kinds=all --show-reachable=no --track-origins=yes ./可执行文件名
  
  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/335615.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号