GDBGDB入门


备注

GDB(GNU Project调试器)是一个命令行基础调试器,擅长分析运行和核心程序。根据用户手册, GDB支持C,C ++,D,Go,Objective-C,Fortran,Java,OpenCL C,Pascal,Rust,汇编,Modula-2和Ada。

GDB具有与大多数调试器相同的功能集,但与我使用的大多数调试器不同,它基于键入命令而不是单击GUI元素。其中一些功能包括:

  • 设定断点
  • 打印变量的值。
  • 设置变量的值以测试出来。
  • 查看堆栈

启动GDB

要在终端中启动GDB,

gdb <executable name>
 

对于上面带有名为main的程序的示例,命令变为

gdb main
 

设置断点

您可能希望程序在某个时刻停止,以便您可以查看程序的状况。您希望程序暂时停止的行称为断点。

break <source code line number>
 

运行你的程序

要运行程序,正如您所猜测的那样,命令是

run
 

打开核心

gdb -c coreFile pathToExecutable  
 

什么是GDB?

GDB是GNU Debugger的缩写,是UNIX系统调试C和C ++程序的最流行的调试器。 GNU Debugger,也称为gdb,是UNIX系统调试C和C ++程序的最流行的调试器。

GNU Debugger可帮助您获取有关以下内容的信息:

  • 如果发生了核心转储,那么程序崩溃了什么语句或表达式?

  • 如果在执行函数时发生错误,则执行什么行
    程序包含对该函数的调用,以及它是什么
    参数?

  • 程序执行期间特定点的程序变量值是多少?

  • 程序中特定表达式的结果是什么?

使用核心文件

创建了这个非常糟糕的程序

 #include <stdio.h>
 #include <ctype.h>

// forward declarations


void bad_function()
{

   int *test = 5;

   free(test);

}


int main(int argc, char *argv[])
{
   bad_function();
   return 0;
}


gcc -g ex1.c

./a.out   //or whatever gcc creates
Segmentation fault (core dumped)

gdb -c core a.out

Core was generated by `./a.out'.
 

程序以信号SIGSEGV,分段故障终止。 malloc.c中的#0 __GI___libc_free(mem = 0x5):2929 2929 malloc.c:没有这样的文件或目录。

(gdb) where
 

malloc.c中的#0 __GI___libc_free(mem = 0x5):ex1.c中的bad_function()中的#2 0x0000000000400549:ex1.c中的12#2 0x0000000000400564(argc = 1,argv = 0x7fffb825bd68):19

因为我用-g编译你可以看到调用where告诉我它不喜欢bad_function()第12行的代码

然后我可以检查我试图释放的测试变量

(gdb) up
 

ex1.c中的bad_function()中的#1 0x0000000000400549:12 12 free(test);

(gdb) print test
 

$ 1 =(int *)0x5

(gdb) print *test
 

无法访问地址0x5处的内存

在这种情况下,错误是非常明显的我试图释放一个指针,该指针只是分配了地址5,而不是由malloc创建的,因此free不知道如何处理它。