GDB 手动调试
基本使用
1、将gdb-7.5.tar.gz拷贝到/usr/local/目录下(可以拷贝到任何你愿意的Linux目录下)
2、解压gdb-7.5.tar.gz
tar -zxvf gdb-7.5.tar.gz
3、编译arm-linux-gdb
到目录gdb-7.5: cd gdb-7.5
执行:
$ ../configure --target=arm-linux --disable-werror --prefix=/usr/local/arm-gdb -v
target指明编译生成的GDB用于调试ARM-LINUX程序,prefix指明安装目录
$ make
$ make install
$ gedit /etc/environment --把arm-linux-gdb加入环境变量 (:/usr/local/arm-gdb/bin)
$ source /etc/environment //更新环境变量
这样就可以在/usr/local/arm-gdb/bin目录下看到如下三个可执行文件
arm-linux-gdb arm-linux-gdbtui arm-linux-run
4.编译gdbserver
cd gdb/gdbserver
./configure --host=arm-linux
cp gdbserver /work/nfs_root/first_fs/bin
5.编译要调试的应用,编译时加上-g选项
arm-linux-gcc -o -g 1 1.c
6.调试
6.1 在ARM板子上
gdbserver 192.168.1.17:2345 ./1
6.2 在PC上
arm-linux-gdb ./1
常用指令
设置断点
break 函数名
break 行号
break 文件名:函数名
break 文件名:行号
break +偏移量
break -偏移量
break *地址
清楚断点
delete <断点id>:删除指定断点
delete:删除所有断点
clear
clear 函数名
clear 行号
clear 文件名:行号
clear 文件名:函数名
(gdb)break main
(gdb)c
(gdb)break 1.c 26
(gdb)step
(gdb)next
查看断点
info break
显示栈帧
bt
bt full:不仅显示backtrace,还显示局部变量
bt N:显示开头N个栈帧
bt full N
输出变量的值
查看寄存器
单步
单步执行有两个命令next和step,两者的区别是next遇到函数不会进入函数内部,step会执行到函数内部。
如果需要逐条汇编指令执行,可以分别使用nexti和stepi。
继续执行
调试时,使用continue命令继续执行程序。程序遇到断电后再次暂停执行;如果没有断点,就会一直执行到结束。
coredump
让程序在开发板上直接运行,当它发生错误时,令它产生core dump文件。
然后使用gdb根据coredump文件,找到发生错误的地方。
在ARM板上执行:
ulimit -c unlimited
执行应用
./1
执行之后会产生coredump文件(core文件)。
在PC机上执行:
arm-linux-gdb ./2 core
可以看到以下结果:
Core was generated by `./2'.
Program terminated with signal 11, Segmentation fault.
#0 0x000084ac in C (p=0x0) at 2.c:5
5 *p = 0x12;
输入bt指令,可以看到详细的信息:
(gdb) bt
#0 0x000084ac in C (p=0x0) at 2.c:5
#1 0x000084d0 in B (p=0x0) at 2.c:10
#2 0x000084f0 in A (p=0x0) at 2.c:15
#3 0x0000855c in main (argc=1, argv=0xbef99ee4) at 2.c:30