当前位置: 首页 > 工具软件 > manual > 使用案例 >

valgrind manual

谷梁星雨
2023-12-01

valgrind manual

基本介绍

Valgrind工具套件提供了一整套的调试和配置工具,其能帮助使你的程序可以运行更快以及更正确.Memcheck是该套件中最为著名一个.它能探测到很多导致C/C++应用程序崩溃和不能定位的crash的内存相关的问题.

基本运行命令

  1. valgrind –tool=memcheck –leak-check=yes –log-file= log.file prog var0 var1

选项说明:
–tool=memcheck:该选项为valgrind最为重要的选项,其默认使用的工具为memcheck
–leak-check=yes:打开详细的内存泄露探测器.
–log-file=file :将valgrind的输出重定向到文件
prog:待检测的应用程序
var0 var1:prog程序的参数

  1. 下面为一个简单的测试程序,用于测试valgrind的基本内存问题探测功
    #include <stdlib.h>
    void f(void)
    {
        int* x = malloc(10 * sizeof(int));//测试内存泄露问题
        x[10] = 0;//测试内存越界写问题
    }
    int main(void)
    {
        f();
        return 0;
    }

程序编译注意事项:
1. 注意程序编译的时候需要开启-g选项,这样valgrind的Memcheck工具输出的内存错误日志会携带具体的错误代码的位置
2. 如果你能忍受较低的程序运行速度,最好使用-O0选项.其他的-O1 -O2选项都会降低错误的定位准确度

    Invalid write of size 4
    ==27316==    at 0x108364: f (mem_leak.c:6)
    ==27316==    by 0x10837B: main (mem_leak.c:12)
    ==27316==  Address 0x48ce050 is 0 bytes after a block of size 40 alloc'd
    ==27316==    at 0x481EFEC: malloc (vg_replace_malloc.c:298)
    ==27316==    by 0x10834F: f (mem_leak.c:5)
    ==27316==    by 0x10837B: main (mem_leak.c:12)
上面输出信息对应于内存越界写的问题,同时指定了发生问题的代码位置为mem_leak.c的第6行
    ==27316== HEAP SUMMARY:
    ==27316==     in use at exit: 40 bytes in 1 blocks
    ==27316==   total heap usage: 1 allocs, 0 frees, 40 bytes allocated
    ==27316== 
    ==27316== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
    ==27316==    at 0x481EFEC: malloc (vg_replace_malloc.c:298)
    ==27316==    by 0x10834F: f (mem_leak.c:5)
    ==27316==    by 0x10837B: main (mem_leak.c:12)
上面的输出信息对应与内存泄露问题,同时指定了内存分配的位置为mem_leak.c:5
    ==27316== LEAK SUMMARY:
    ==27316==    definitely lost: 40 bytes in 1 blocks
    ==27316==    indirectly lost: 0 bytes in 0 blocks
    ==27316==      possibly lost: 0 bytes in 0 blocks
    ==27316==    still reachable: 0 bytes in 0 blocks
    ==27316==         suppressed: 0 bytes in 0 blocks
上面为该程序运行完成后的内存问题的总体情况,可以看到"definitely lost: 40 bytes in 1 blocks"表示内存肯定泄露了40个字节

Suppressing errors(忽略错误提示)

基本介绍

Valgrind的error-checking工具会检测很多关于系统库的问题,例如安装在OS中的C库.我们一般不能轻易修改C库的代码,但是你又不想看到这些错误信息.所以Valgrind提供了一种错误过滤的机制(suppressing errors).在使用./configure配置Valgrind时会生成一个默认的suppressing文件(default.supp).该文件过滤了很多系统库,我们可以定制该文件,这样就能过滤掉与自己程序不相关的错误提示.
在启动valgrind时,我们可以使用--suppressions=/path/to/file.supp指定自己的配置文件.Valgrind提供了一种手动配置suppressions的方式,当启动valgrind时使用--gen-suppressions=yes选项,可以手动配置suppressions的过滤规则.

suppression files配置

    {
        Android5.1 carekitgwd-libcrypto-func-Value4
        Memcheck:Value4
        fun:OPENSSL_cleanse
        lib:/lib/libgcc.so
      }
上面为一个过滤规则的一般格式,其中
第一行:该规则的名字
第二行:Memcheck的suppressions类型,一般有这几个类型
```
1. Value1, Value2, Value4, Value8, Value16:代表未知(可能未初始化)的变量(1byte 2bytes 4 byes 8 bytes 16bytes)
2.Cond:使用了未知的CPU Condition code(不知道如何翻译)
3.Addr1, Addr2, Addr4, Addr8, Addr16:表示访问了无效的内存地址(1byte 2bytes 4 byes 8 bytes 16bytes)
4.Jump:表示一个不可寻址的跳转
5.Param:表示一个无效系统调用参数
6.Overlap:表示内存拷贝越界,例如mmcpy中src/dst中地址越界
7.Leak:表示内存泄露
```
第三行:fun表示需屏蔽错误的函数
第四行:lib表示需要屏蔽错误的库文件

其中,前两行必须有,第三四行至少配置一项.
 类似资料:

相关阅读

相关文章

相关问答