开始
- 近来在写网络服务器程序,涉及到了多线程,且由于网络的环境复杂的原因,常有未知情况发生,导致在程序中自行添加调试语句显得有些吃力
- 将
gdb
请出山来是一个最为正确的选择
使用
gdb
看起来是全命令行的东西,而且一启动就是一大片英文,实在让没用过的望而却步,其实真正常用的就只有那几个功能。接下来我可能不会对这些命令进行明确的定义功能,因为有时候某些功能放在不同的地方意义就不同了,所以我只用最简单的语言来记录它们。
首先是安装,在(Debian)系的发行版 Linux 上,使用
apt-get install gdb
回车等一会就行,可能有的发行版已经装好了,但有的却没有。首先不要打开这个
gdb
,因为这里面的东西的确看起来挺复杂的- 我们要先有一个程序的源文件,假设是 C语言 的
main.c
在里面写好正确的语句后,对它进行编译,链接,也就是调用
GCC
,这里使用GCC
的命令是gcc -o main -g main.c
这个-g
标志非常必要,意味着生成一些符号信息,用人话说就是gdb
所需要的东西,没有这个东西是无法使用gdb
进行调试的。紧接着,在当前目录下就有一个名为
main
的可执行文件,看好当前用户是否有权限执行它之后,使用如下命令开启调试旅程:gdb ./main
紧接着,出现一大堆英文,不要慌,静静的等待它们装逼,最后会出现一个(gdb)
光标在闪烁的时候,就证明gdb
加载这个程序的符号信息完毕,你可以准备执行了这时候,你只要输入一个字母
r
, 就能让这个main
程序执行起来(gdb) r
- 如果这个程序没有问题的话,几乎就和在外面正常运行时一样,
gdb
没有起到任何作用,但是一旦有任何问题的话,gdb
就会暂停在那个出错的地方,而不是继续执行。 这里说的出错,不一定代表着就是程序出错或者崩溃退出,有可能是程序接收到了某个信号,信号在
Linux
中并不少见,这对于某些特殊用途的程序而言,看到接收到的信号十分重要,例如网络程序。对于
r
这个命令除了这么孤零零的使用以外,还可以对它进行传递参数,例如你的main
程序需要两个参数,你可以这样(gdb) r 192.168.141.149 8889
这就和在外面使用:./main 192.168.141.149 8889
的效果一样- 第二个命令自然是,最常用的设置断点,这也是十分简单, 命令就一个字母
b
最简单的用法就是直接接着一个数字,代表着要设置断点的地点(行),例如
(gdb) b 10
表示在当前的执行文件中的第十行设置一个断点,设置完了会有成功信息:
Breakpoint 1 at 0x400556: file main.c, line 10.
意思就是,设置了第一个断点,在内存位置
0x400556
地方,人类能懂得地方在 main.c 文件的第十行另一种情况就是,当你的程序是多个文件编译而成的时候,你如果不指定文件名,那么默认就是在当前执行的这个地方所属的文件里设定
(gdb) b main.c:10
这就是完