五个 Linux 下用户空间的调试工具(2)

tar -xjvf valgring-x.y.z.tar.bz2 (where x.y.z is the version number you are trying to install)

进入新创建的目录(的valgrind-XYZ)内运行以下命令:

./configure

make

make install

让我们通过一个小程序(test.c)来理解valgrind怎么工作的:

#include<stdio.h>

 

void f(void)

 

{

int x = malloc(10*sizeof(int));

 

x[10]=0;

}

 

int main()

{

f();

return0;

}

编译程序:

gcc -o test -g test.c

现在我们有一个可执行文件叫做'test'。我们现在可以用valgrind来检测内存错误:

valgrind tool=memcheck leak-check=yes test

这是valgrind呈现错误的输出:

output of valgrind showing heap block overrun and memory leak

valgrind显示堆溢出和内存泄漏的输出

正如我们在上面看到的消息,我们正在试图访问函数f未分配的内存以及分配尚未释放的内存。

5. GDB

GDB是来自自由软件基金会的调试器。它对定位和修复代码中的问题很有帮助。当被调试的程序运行时,它给用户控制权去执行各种动作, 比如:

启动程序

停在指定位置

停在指定的条件

检查所需信息

改变程序中的数据 等。

你也可以将一个崩溃的程序coredump附着到GDB并分析故障的原因。

GDB提供很多选项来调试程序。 然而,我们将介绍一些重要的选择,来感受如何开始使用GDB。

如果你还没有安装GDB,可以在这里下载:GDB官方网站

编译程序:

为了用GDB调试程序,必须使用gcc的'-g'选项进行编译。这将以操作系统的本地格式产生调试信息,GDB利用这些信息来工作。

下面是一个简单的程序(example1.c)执行被零除用来显示GDB的用法:

#include

int divide()

{

int x=5, y=0;

return x / y;

}

 

int main()

{

divide();

}

An example showing usage of gdb

展示GDB用法的例子

调用 GDB:

通过在命令行中执行'gdb'来启动gdb:

invoking gdb

调用 gdb

调用后, 它将等待终端命令并执行,直到退出。

如果一个进程已经在运行,你需要将GDB连接到它上面,可以通过指定进程ID来实现。假设程序已经崩溃,要分析问题的原因,则用GDB分析core文件。

启动程序:

一旦你在GDB里面,使用'run'命令来启动程序进行调试。

给程序传参数:

使用'set args'给你的程序传参数,当程序下次运行时将获得该参数。'show args'将显示传递给程序的参数。

检查堆栈:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/16661.html