没有调试器的情况下编写程序时最糟糕的情况是什么?编译时跪着祈求不要犯错?用血祭呼唤恶魔帮你运转程序?或许在每一行代码间增加printf(test)句子来定位错误点?如你所知,编写程序时不运用调试器的话是不便利的。幸亏,linux下调试仍是很便利的。大多数人运用的IDE都集成了调试器,但 linux 最著名的调试器是指令行方式的C/C++调试器GDB。但是,与其他指令行东西共同,DGB需求必定的操练才干彻底把握。这儿,我会告知你GDB的基本情况及运用办法。

装置GDB
大多数的发行版库房中都有GDB
Debian 或 Ubuntu
$ sudo apt-get install gdb
Arch Linux
$ sudo pacman -S gdb
Fedora,CentOS 或 RHEL:
$sudo yum install gdb
如果在库房中找不到的话,能够从官网中下载。
示例代码
当学习GDB时,最好有一份代码,着手试验。下列代码是我编写的简略比如,它能够很好的表现GDB的特性。将它复制下来并且进行试验——这是最好的办法。
#include #include int main(int argc, char **argv) { int i; int a=0, b=0, c=0; double d; for (i=0;i100;i++) { a++; if (i>97) d = i / 2.0; b++; } return 0; }
GDB的运用
首要最重要的,你需求运用编译器的 “-g“选项来编译程序,这样可执行程序才干经过GDB来运转。经过下列句子开端调试:
$ gdb -tui [可执行程序名]
运用”-tui“选项能够将代码显现在一个美丽的交互式窗口内(所以被称为“文本用户界面 TUI”),在这个窗口内能够运用光标来控制,一起鄙人面的GDB shell中输入指令。

现在咱们能够在程序的任何地方设置断点。你能够经过下列指令来为当时源文件的某一行设置断点。
break [行号]
或许为一个特定的函数设置断点:
break [函数名]
乃至能够设置条件断点
break [行号] if [条件]
例如,在咱们的示例代码中,能够设置如下:
break 11 if i >97

这样,程序循环97次之后停留在“a++”句子上。这样是十分便利的,避免了咱们需求手动循环97次。
最终但也是很重要的是,咱们能够设置一个“调查断点”,当这个被调查的变量发生变化时,程序会被中止。
watch [变量]
这儿咱们能够设置如下:
watch d
当d的值发生变化时程序会中止运转(例如,当i>97为真时)。
当设置断点后,运用run指令开端运转程序,或按如下所示:
r [程序的输入参数(如果有的话)]
gdb中,大多数的指令单词都能够简写为一个字母。
不出意外,程序会停留在11行。这儿,咱们能够做些风趣的工作。下列指令:
bt
回溯功用(backtrace)能够让咱们知道程序怎么抵达这条句子的。

info locals
这条句子会显现一切的局部变量以及它们的值(你能够看到,我没有为d设置初始值,所以它现在的值是恣意值)。
当然:

p [变量]
这个指令能够显现特定变量的值,而更进一步:
ptype [变量]
能够显现变量的类型。所以这儿能够确认d是double型。

已然现已到这一步了,我么无妨这么做:
set var [变量] = [新的值]
这样会掩盖变量的值。不过需求留意,你不能创立一个新的变量或改动变量的类型。咱们能够这样做:
set var a = 0

如其他优异的调试器相同,咱们能够单步调试:
step
运用如上指令,运转到下一条句子,有或许进入到一个函数里边。或许运用:
next
这能够直接运转下一条句子,而不进入子函数内部。

完毕测验后,删去断点:
delete [行号]
从当时断点持续运转程序:
continue
退出GDB:
quit
总归,有了GDB,编译时不必祈求天主了,运转时不必血祭了,再也不必printf(“test“)了。当然,这儿所讲的并不完好,并且GDB的功用远远不止于此。所以我强烈建议你自己愈加深化的学习它。我现在感兴趣的是将GDB整合到Vim中。一起,这儿有一个备忘录记录了GDB一切的指令行,以供查阅。