软件取证:使用valgrind
在一个像SPIES这样庞大而复杂的程序里面,查找错误十分费时,所以C黑客写了一些帮助查错的工具。其中,有一个叫valgrind
的工具,它用于Linux操作系统中。
valgrind
通过伪造malloc()
可以监控分配在堆上的数据。当程序想分配堆存储器时,valgrind
将会拦截你对malloc()
和free()
的调用,然后运行自己的malloc()
和free()
。valgrind
的malloc()
会记录调用它的是哪段代码和分配了哪段存储器。程序结束时,valgrind
会汇报堆上有哪些数据,并告诉你这些数据是由哪段代码创建的。
准备好代码:添加调试信息
在使用valgrind
运行代码前,你不需要做任何修改,甚至不需要重新编译代码。但为了发挥valgrind
的最大威力,应当在可执行文件中包含调试信息。调试信息是编译时打包到可执行文件中的附加数据,比如某段代码在源文件中的行号。只要有调试信息,valgrind
就能提供更多有助于发现存储器泄漏的信息。
为了在可执行文件中加入调试信息,需要加上-g
开关,并重新编译源代码。
真相只有一个:审问代码
为了弄明白valgrind
是如何工作的,我们在Linux命令行中打开它,用它审问几次SPIES程序。
首先,我们用程序来辨认默认嫌疑犯Vinny the Spoon。在命令行启动valgrind
,加上--leak-check=full
选项,并把你想运行的程序传给valgrind
: