55 使用Valgrind调试内存泄漏
登录

使用Valgrind调试内存泄漏

作者: osgChina 发布于2018-10-22 17:14:13 分类 : 用户指南

本文提到的Valgrind工具只支持Linux。内存泄漏是个大话题,工具也非常多,大家如果关注到了这方面可以百度一下内存常用的调试工具,但是由于OSG使用了大量的全局静态变量等,使得使用内存调试工具调试难度很大,因为无用信息太多,根据代码逻辑调试还是主要的手段---FreeSouth注。

Valgrind 是一个非常好的内存检查调试工具,它会根踪你在CPU上执行的所有指令,并且它自身开源,而且不需要你的应用程序做什么特殊配置,只需要在DEBUG模式下运行就可以了。当然在DEBUG模式下运行时,会非常慢。

Valgrind 3.0.1及其以后版本可以用来调试OSG程序,作者仅仅在GNU/Linux X86平台Nvidia下使用过valgrind。Valgrind可以成功的在GCC 3.4.2/Fedora和GCC 4.0.1/Fedora 下运行,其它新版本的Linux也工作的很好。

Valgrind在调试OSG程序时会暴露一些英传达显卡驱动所没有解决的问题,它会把这些问题出在一个单独的报表文件中,名为opengl.supp。下面是使用的调试命令行和一个opengl.supp示例文件(将progname替换为程序名,将progrargs替换为程序参数)。

valgrind --gen-suppressions=all --leak-check=full --num-callers=40 --log-file=out --suppressions=opengl.supp --error-limit=no -v <progname> <progargs>

opengl.supp示例:

{
   opengl addr4 (1)
   Memcheck:Addr4
   obj:/usr/lib/libGL*
}
{
   opengl param (2)
   Memcheck:Param
   ioctl(generic)
   fun:ioctl
   fun:_nv*gl
   obj:/usr/lib/libGL*
}
{
   opengl cond (3)
   Memcheck:Cond
   obj:/usr/lib/libGL*
}
{
   opengl param (4)
   Memcheck:Param
   ioctl(generic)
   fun:ioctl
   obj:/usr/lib/libGL*
}
{
   opengl cond (5)
   Memcheck:Cond
   fun:_nv*gl
   obj:/usr/lib/libGL*
}
{
   opengl cond (6)
   Memcheck:Cond
   fun:strcat
   obj:/usr/lib/libGL*
}
{
   opengl value4 (7)
   Memcheck:Value4
   obj:/usr/lib/libGL*
}
{
   opengl memleak (8)
   Memcheck:Leak
   fun:calloc
   obj:/usr/lib/libGL*
}
{
   opengl memleak (9)
   Memcheck:Leak
   fun:malloc
   obj:/usr/lib/libGL*
}