一、启动调试
1、gdb启动
gdb启动非常简单,只要直接执行下面的命令:
gdb exename(调试文件的名称)
2、设置参数
如果需要调试的程序需要输入参数怎么办呢?有三种方法可以实现:
a、在启动调试程序时使用命令参数设置
gdb --args ./test abc //test是执行程序,abc是参数
b、在启动调试程序后用参数设置命令
setargs 参数1 参数2.....
c、在启动调试后使用运行命令带入参数
gdb test
r 参数1 ...
3、开始调试
启动调试程序后并没有进入调试程序内部,此时虽然可以设置断点等操作,但真正开始调试还要执行启动执行命令,有两种方式:
a、直接使用r(run)命令
直接进入调试状态到断点。如果没有断点,则一直执行到最终或者进入相关循环状态。
b、使用start命令
此命令只会执行到main函数的第一行。可以认为是执行r命令,但是在main函数第一行设置了断点。
4、屏蔽说明信息
在启动gdb时会出一大串的说明信息,铺天盖地的,这个当然可以不显示使用下面的命令参数-q:
gdb exename -q
二、进程附加调试
这种情况应用在不可停止的程序调试上,有三种方式:
gdb exename pid(进程ID,如13678) // 附加到想调试的运行进程
gdb -p pid // 附加到想调试的运行进程
//分两步执行先启动gdb,再附加
gdb
attach 3598 //先启动gdb,再附加到调试程序
三、远端调试
需要下载gdbserver,在Ubuntu中可以使用apt命令来安装。成功后,找两台机器:
A:IP(192.168.2.22) 端口:8000 B:IP(不考虑)
A做为被调试端,为Server远端机,在其上执行并出现下面界面:
gdbserver 192.168.2.22:8000 d1 或者【gdbserver IP:port --attach pid】
Process /home/fjf/gdbtest/bin/d1 created; pid = 3968
Listening on port 8000
B做为本地调试机器,执行下面命令:
//先启动gdb
gdb
//再使用target命令连接远端即A
target remote 192.168.2.22:8000
//连接成功后,下断点
b 55
//执行
n
//显示数据
p xdata
下面一个本机模拟外机连接(即A、B两台机器都在一台电脑上,和网络测试一样),另外一个B本地机在另外一台机器上(A、B是完全不同的两台电脑)。
相同机器:
两机:
由于第二台机器没有拷贝源码,所以只能查看调试数据,看不到代码相关内容。
注意,这里B机器(本地机器),连接远端后不支持r命令,可以使用c命令启动执行。
这次对远端调试做了实例分析,更有可操作的借鉴性。
三、调试core文件
如果程序在运行后崩溃,可以使用gdb调试相关崩溃的信息:
gdb exename core.13567
bt
一般来说,崩溃后最有价值的当然是bt命令中看到的调用堆栈,可以大概推断到哪个函数甚至哪行出了问题。
四、进入和退出函数
在使用b命令断点打好之后,可以有几种命令来进行调试:
a、使用n或nexti命令
此命令在当前函数内执行到下一行,但不进入调用函数中。netxi代表单步执行一条机器指令,同样也不进入调用函数
b 、使用s或stepi命令
此命令与上一条命令类似,但进入函数。
c 、使用c命令
继续执行当前调试程序,走到断点或者结束。
d、使用finish命令
这可以理解成为s命令的逆向命令,退出函数调用。当然这个命令可以用在函数外部设置断点,c命令直接到断点来实现。
五、总结
gdb这个系列会不定期的根据情况来更新,主要目的是把一些前面应用时忽略的技巧和方法在实际工程中用到后就总结出来,所以可以不如以前的系列完备,如果对gdb有一些更深的了解的可以翻看一下以前的文章并对比相关书籍,一定会有所收获。
注意:要想调试,最主要的别忘记在编译程序时增加-g选项,当然在其它方式的编译情况下也要选择与此相同功能的设置,如cmake的CMakeLists.txt文件中增加“set(CMAKE_BUILD_TYPE Debug)”,诸如此类。