【linux】Valgrind工具集详解(二):入门

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010168781/article/details/83546628

一、使用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)

猜你喜欢

转载自blog.csdn.net/u010168781/article/details/83546628
今日推荐