Valgrind
外观
Valgrind (可在此处下载) 是一个用于调试 x86 和 x86-64 Linux 平台程序的实用程序。它最近变得非常流行,因为它可以轻松地跟踪难以追踪的内存管理和线程错误。
有一个“通用”选项,在大多数系统上都可用,这涉及到编译
user> wget http://valgrind.org/downloads/valgrind-3.8.1.tar.bz2 user> bunzip2 valgrind-3.8.1.tar.bz2 user> tar -xvf valgrind-3.8.1.tar user> cd /valgrind-3.8.1 user> ./configure user> make user> su root root> make install
然而,在大多数 Linux 发行版上,您可以使用包管理系统。例如,在 Debian GNU/Linux(及其衍生版本)中,只需运行
apt-get install valgrind
Valgrind 可以通过在您运行的命令行前面加上 valgrind 来简单地运行
./myprogram -o option
valgrind ./myprogram -o option
这个简单的测试将检查程序中的内存访问是否正确。当您收到关于您知道没有问题的代码的消息时,不要感到惊讶。该程序测试了所有访问,并且某些程序可以容忍现有的错误。修复这些额外的错误总是值得的,因为当它们确实导致代码中断时,它们将无法追踪。
您可能更喜欢运行 valgrind 并将日志记录到文本文件,使用以下选项
valgrind --leak-check=full --freelist-vol=100000000 --log-file-exactly=log.txt -v ./myprogram
Valgrind 本质上是一个 x86 机器码解释器。实际上,它作为即时编译器运行,将机器码转换为内部语言,对该语言进行检测,然后从该语言生成代码。Valgrind 检测代码以监控内存分配、释放、写入和读取,这使它可以保存内存状态的位图。因此,它可以报告尝试从从未写入的内存中读取数据,或者使用最近释放的内存。在 Valgrind 下,程序的运行时间将比未检测时大约慢 2-10 倍。
Callgrind 是一个相关的程序,它使用相同的 x86 解释器技术来检测代码,以记录例程调用并生成一个文件,该文件可以分析以显示在各种例程中花费的时间以及所涉及的调用路径。