一、使用valgrind
1、安装
安装超级简单:
sudo apt-get install valgrind
2、使用
运行valgrind -h可以查看详细使用方法,命令格式如下:
valgrind [valgrind -h中的选项] 待测程序 [待测程序的命令行参数列表]
最重要的选项是–tool决定运行哪种Valgrind工具。
例如,使用内存检查工具Memcheck 运行“ls -l”命令 ,执行命令格式如下:
valgrind --tool = memcheck ls -l
Memcheck是默认设置,因此如果要使用它,则可以省略该–tool选项,如:
valgrind ls -l
3、原理
无论使用哪种工具,Valgrind都会在程序启动前控制待测程序。从可执行文件和相关库中读取调试信息,以便在适当时可以根据源代码位置来表示错误消息和其他输出。
然后,待测程序将在Valgrind核心提供的“合成CPU”上运行。当新代码首次执行时,Valgrind核心将程序代码交给选定的工具。该工具将自己的检测代码添加到此处,并将结果交还给核心,核心协调持续执行此检测代码。
添加的检测代码量在不同工具之间差异很大。Memcheck添加了代码来检查每个内存访问和计算的每个值,使其运行速度比本机慢10-50倍。为Nulgrind(最小工具)根本不添加任何仪器,运行速度比本机慢4倍。
Valgrind模拟程序执行的每条指令。因此,活动工具不仅检查应用程序中的代码,还检查所有支持动态链接库(包括C库,图形库等)的代码。
如果使用的是错误检测工具,Valgrind可能会检测系统库中的错误,例如使用了GNU C或X11库。尽管对这些错误不感兴趣,但是无法控制该代码。因此,Valgrind允许通过将它们记录在Valgrind启动时读取的“抑制文件”(后续会专门讲)中来有选择地抑制错误(就是系统库中的错误不打印出来)。Valgrind构建机制选择默认抑制,为计算机上检测到的操作系统和库提供合理的行为。为了更容易编写抑制,可以使用该 --gen-suppressions=yes选项。这告诉Valgrind打印出每个报告错误的抑制,然后可以将其复制到抑制文件中。
不同的错误检查工具会报告不同类型的错误。因此,抑制机制允许标记出每个抑制适用于哪个工具或工具。
4、对编译程序时的gcc选项的一点说明
最好使用debug版本(gcc -g),这样打印的信息中会将错误和分析的信息指定出相关的代码行;
如果是C++最好将内联函数以普通函数对待(gcc -fno-inline),这样更容易看到函数调用链,这有助于减少在大型C ++应用程序中导航时的混淆;
不要使用优化(gcc -O2或gcc-O1等),这会导致Memcheck错误地报告未初始化的值错误或丢失未初始化的值错误;
最好编译时能显示所有警告(gcc -Wall)