菜鸟笔记
提升您的技术认知

valgrind简单使用介绍

valgrind使用

内存检查工具memcheck

valgrind --tool=memcheck yourprogram

线程工具helgrind

valgrind --tool=helgrind yourprogram

其他常用选项

指定log输出文件,有时候不想程序的打印输出和valgrind的报告信息混杂在一起输出,指定该文件就可以得到仅包含valgrind报告信息的文件

--log-file=you_log_file_path

屏蔽指定规则的输出,有时候程序引用了第三方的库,而自己仅仅关注自己写的模块,不关心第三方库的valgrind信息,则需要指定规则屏蔽第三方库的
输出

--suppressions=you_rules_file_path

每个suppression以{}开始结束,并由以下行组成:

  • 第一行:这个suppression的name,valgrind以后就会以这个name代表这个suppression
  • 第二行:这个suppression suppress的tool及它的类型,如memcheck:type
  • 第三行:如果第二行需要参数(一般系统调用的suppression需要这一行),则在这行指定
  • 剩余行:这个suppression的context,相当于调用栈。可以指定函数function或者share object
  • 1)函数格式:func:function-name,注意如果是c++,只能用mangled name,如果是手动写,可以用--demangle-no在错误信息里获取mangled name
  • 2)share object: obj:objname-path-name
  • 3)函数名和share object名可以用*和?匹配任意字符,可以用...匹配context链路的一条

示例:

{
    hello
    Helgrind:Race
    obj:/usr/lib/x86_64-linux-gnu/libmosquitto.so.1
}

{
    world
    Helgrind:Race
    fun:cJSON_ParseWithLengthOpts
}

memcheck的suppression关键字

  • Value1, Value2, Value4, Value8, Value16:代表1-16字节的未初始化变量的使用
  • Cond (or its old name, Value0):表示未初始化的cpu条件变量
  • Addr1, Addr2, Addr4, Addr8, Addr16:表示1-16字节的不可addressable的内存访问
  • Jump:表示跳转到一个不可addressable的地方
  • Param:表示系统调用syscall的参数错误,这个类型需要另外一行指定syscall的那个参数
  • Free:表示不匹配的内存释放
  • Overlap:表示在memcpy时source和destination有重叠
  • Leak:表示内存泄漏

helgrind的关键字目前未找到相关文档,不过可以通过

--gen-suppressions=all

在探测到错误时,生成对应的suppression语句。然后根据需要拷贝至文件,然后以此文件屏蔽指定的错误。