一、GDB调试
编译程序时应加上-g选项
1、在gdb启动时指定被调试程序的参数
如:gdb -args ./test a b c
2、在gdb中通过命令来设置
如:(gdb)set args a b c
(gdb)show args
3、在程序运行时直接指定
如:(gdb)r a b
(gdb)show args
(gdb)中常用命令:
l |
显示源代码,后可加行号、函数名 |
break n |
在第n行设置断点(后可加if条件) |
break func |
在函数func处设置断点 |
info break |
查看断点信息 |
r |
运行程序 |
n |
单步执行(不进入函数) |
s |
单步执行(进入函数) |
c |
继续运行程序,同continue |
P /<f> str |
打印变量str的值,同print,<f>是输出格式,如/x表示输出为十六进制 |
forward-search xx |
向前搜索xx字符 |
reverse-search xx |
向后搜索xx字符 |
bt |
显示程序堆栈,调用栈信息 bt full:显示所有程序的局部变量值 info locals:打印当前程序的局部变量值 |
finish |
退出当前函数 |
q |
退出调试 |
:: 用于指定一个文件或一个函数中的变量
@ 用于查看一段连续的内存空间的值,比如数组的一段
如:
int *array = (int *)malloc(len * sizeof(int));
(gdb)P *array@len表示查看数组第一个元素的内存地址的值@查看内存的长度
x 查看内存命令,examine的简写
x /nfu addr //表示以f格式打印从addr开始的n个长度单位为u的内存值
n为输出单元的个数
f为输出格式,x表示16进制输出,o表示8进制输出
u为单元长度,b表示byte,h表示2个byte,w表示4个byte,g表示8个byte
设置观察点
watch <expr>
为表达式/变量expr设置一个观察点,一旦表达式值有变化时马上停住程序。使用delete命令可删除观察点
设置捕捉点
catch <event>
当event发生时停住程序,event可以为throw的异常、catch到的异常、exec、fork等。
维护停止点,可使用clear、delete、disable和enable等命令
为停止点设定运行命令:
commands [bnum]
...command-list...
end
为断点号bnum指定一个命令列表,当该断点生效时,gdb会依次运行list中的命令。
二、GDB远程调试
1、gdbserver方式
gdbserver允许远程GDB调试器通过target remote命令与运行在目标板上的程序建立连接。GDB和gdbserver之间可通过串口线或TCP/IP网络连接通信,采用的通信协议是标准的GDB远程串行协议(Remote Serial Protocol)。
2、stub(插桩)方式
调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。stub方式则需要通过链接器把调试代理和要调试的程序链接成一个可执行的应用程序文件,如果程序运行在没有操作系统的机器上,那么stub需要提供异常和中断处理序,以及串口驱动程序,如果程序运行在有操作系统的嵌入式平台上,那么stub需要修改串口驱动程序和操作系统异常处理。
目标机上安装GDB:
1、下载、解压gcc源码包
#tar xzvfgdb-7.4.tar.gz
2、安装相关工具
#sudoapt-get install texinfo
#sudoapt-get install libncurses5-dev
#sudoapt-get install m4
#sudoapt-get install flex
#sudoapt-get install bison
3、安装GDB
#./configure --target=arm-linux --prefix=/usr/local/arm-gdb-v
# make
# make install
4、编译gdbserver
配置:
#cd /gdb/gdbserver
#./configure --target=arm-linux --host=arm-linux
编译阶段:
#make CC=arm-linux-gcc
交叉编译:
#arm-linux-gcc–g tstgdb.c–o tstgdb
目标机运行:
#./gdbserver10.0.0.10:2335 tstgdb
开发机调试程序:
#arm-linux-gdb tstgdb
(gdb)target remote 10.0.0.10:2335