后端开发核心技术 第5章调试Valgrind

Valgrind概述

Valgrind简介:
1、Valgrind是动态分析工具的框架。有很多Valgrind工具可以自动的检测许多内存管理和多进程/线程的bugs,在细节上剖析你的程序。你也可以利用Valgrind框架来实现自己的工具。
2、Valgrind通常包括6个工具:一个内存错误侦测工具,两个线程错误侦测工具,cache和分支预测的分析工具,堆的分析工具。
在这里插入图片描述

Memcheck

重量级的内存检查其,能够发现绝大多数内存错误使用情况。比如:使用未初始化的内存,使用已经释放的内存,内存访问越界的问题

Callgrind

与gprof类似的分析工具,对程序的运行观察更是入微。与gprof不同,不需要再编译源代码时附加特殊选项,但推荐加上调试选项。
Callgrind收集程序运行的一些数据,建立函数调用关系图。在运行结束时,它会把分析数据写入一个文件。callgrind——annotate可以把这个文件的内容转换成可读的形式

Cachegrind

主要用来检查程序中缓存使用出现的问题。Cache分析器,它模拟CPU中的一级缓存I1、D1和二级缓存看,能够精确地指出程序中Cache的丢失和命中。可以为用户提供Cache丢失次数,内存引用次数以及每行代码,、每个函数、每个模块及程序产生的指令数

Helgrind

用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而有没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。

Massif

堆栈分析器,能够测量程序中在堆栈中使用了多少内存,告诉我们堆块、堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,他还能够加速程序的运行,减少程序停留在交换区中的概率

Extension

利用Core提供的功能,自己编写特定的内存调试工具

内存检查原理(Memcheck)

Memcheck能够检查出内存文艺,关键在于其建立两个全局表

Valid-Value(V)bits表

对于进程中的整个地址空间的每一个字节(Byte),都有与之对应的8bit;对于CPU的每个寄存器,也有一个与之对应的bit向量。这些bit负责记录该字节或者寄存器值是否具有有效的、已初始化的值

Valid-Address(A)bits表

对于进程整个地址空间的每一个字节(Byte),还有与之对应的1bit,负责记录该地址是否能够被读写
该表通过以下进行维护

全局数据(data, bss section)--在程序启动的时候标记为合法地址

局部变量--监控sp(stack pointer)的变化,动态维护

动态分配的内存--截获 分配/释放 内存的调用 :malloc, calloc, realloc, valloc, memalign, free, new, new[], delete and delete[]

系统调用--截获mmap映射的地址

其他--可以显示知会memcheck某地字段是合法的

检测原理

当要读写内存中某个字节时,首先检查这个字节对应的Abit。如果该Abit显示该位置是无效位置,Memcheck则报告读写错误。
内核(core)类似于一个虚拟的CPU环境,这样当内存中的某个字节被加载到真实的CPU中,该字节对应的Vbit也被加载到CPU环境中。一旦寄存器中的值,被用来产生内存地址,或者该值能够影响程序输出,则Memcheck会检查对应的Vbit,,如果该值尚未初始化,则会报告使用未初始化内存错误

Valgrind使用

#include<iostream>
#include<stdlib.h>
using namespace std;
void func(){
    int *x=(int *)malloc( 10 * sizeof ( int ) ) ;
    x[10]=0;
}
int main(){
    func();
    cout<<"done"<<endl;
    return 0;
}

g++ -g -o test test.cpp
./test 输出done
/home/zyh/valgrind/bin/valgrind ./test
在这里插入图片描述
下面的提示了Valgrind通过运行被测试程序中发现的一些内存问题

在这里插入图片描述
一、这是一个堆内存的非法写操作,非法写操作的内存是4Byte
二、发送错误是的函数堆栈,具体的源代码行号是第6行
三、非法写操作的具体地址空间
下面是对非发现的内存问题和内存泄漏问题的总结,程序结束时,程序泄露了40Byte的内存。
在这里插入图片描述
该程序两个问题
①fun函数中动态申请的堆内存没有释放
②对堆内存的访问越界

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值