Valgrind 笔记

概述

Valgrind 是一个工具性的框架,可以用来构建动态分析工具。
Valgrind提供的工具可以动态的检测许多内存管理和线程的bug,从细节的角度描述你的程序,当然,你也可以用valgrind来构建新的工具。

快速了解

先有一个基本的认识再对细节进行探究:

Valgrind工具集提供了一些debug和程序分析工具来帮助你的程序运行的更快更好,在这些工具中,最常用的是 Memcheck,它可以检测C和C++程序中经常出现的内存相关的问题,这些问题经常引起程序的崩溃和无法预知的行为。
那么首先来快速使用了解一下Memcheck这个工具

  1. 编译程序
    Valgrind做为一款代码分析工具,首先我们要有可供分析的程序,
    编译程序时带上编译选项-g包含debug信息可以使Valgrind的报错消息对应程序中确切的行数。

  2. 运行程序

普通运行时采用这种方式

 myprog arg1 arg2

而通过Valgrind扫描程序时通过这种方式

valgrind --leak-check=yes myprog arg1 arg2

memcheck是默认选项,–leak-check选项是为了打开细节内存溢出检测器。

注意这时你的程序将会比平常运行的速度慢20-30倍,并且比平时消耗大很多的内存,memcheck会显示出内存的错误和内存的泄漏问题。
3. 解释memcheck的输出结果

下面是一份实例的c代码

 #include <stdlib.h>

  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;
  }

按上述步骤编译运行后在我的机器上打印如下信息

==31042== Invalid write of size 4 ==31042== at 0x4004B6: f (a.c:6) ==31042== by 0x4004C6: main (a.c:11) ==31042== Address 0x4c33068 is 0 bytes after a block of size 40 alloc'd ==31042== at 0x4A0610C: malloc (vg_replace_malloc.c:195) ==31042== by 0x4004A9: f (a.c:5) ==31042== by 0x4004C6: main (a.c:11)

插一段,关于各种变量未初始化时会出现的情况

对于位于程序中不同段的变量,其初始值是不同的,全局变量和静态变量初始值为0,而局部变量和动态申请的变量,其初始值为随机值。如果程序使用了为随机值的变量,那么程序的行为就变得不可预期。

例子

#include <stdlib.h>
#include <stdio.h>

int a;

void f()
{
    int c;
    printf("c=%d\n",c);
}

int main(void)
{
    const int b;
    int *p=(int *)malloc(sizeof(int));
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    f();
    printf("d=%d\n",&p);
    return 0;
}

结果

[root@localhost valgrindtest]# ./a.out
a=0
b=0
c=11028
d=1285341472

你可能感兴趣的:(Valgrind 笔记)