一、调试原理
我们所说的gdb调试是在pc机上对在开发板上运行的程序进行调试。需要在pc机上要运行gdb(clint),在ok335开发板上运行gdbserver。在使用gdb调试的时 候,pc机上运行的gdb向开发板上的gdbserver发出命令,而开发板上的gdbserver就会向应用程序发出信号,使应用程序停下来或者完成其他一 些操作。
二、安装gdb和gdbserver:
此次测试我们使用的是gdb-7.4,我们使用的ubuntu14.04 64位操作系统。
生成gdb:
1、gdb包下载: http://ftp.gnu.org/gnu/gdb/
2、执行解压命令:
tar xvfz gdb-7.4.tar.bz2
3、执行命令:
cd gdb-7.4/
4.安装路径:mkdir __install
5. 设置 PATH :export PATH=/usr/local/arm/cross/am335xt3/devkit/bin/:$PATH
6 配置:./configure --target=arm-arago-linux-gnueabi --prefix=/home/diske/home/machao/gdb-7.4/__install
7、编译:make
8、安装:make install
arm-arago-linux-gnueabi-gdb安装到了我们当前目录的__install里面
gdbserver
1、cd gdb/gdbserver/
2、配置: ./configure --host=arm-arago-linux-gnueabi --target=arm-arago-linux-gnueabi --prefix=/home/diske/home/machao/gdb-7.4/gdb/gdbserver/__install
3、编译: make CC=arm-arago-linux-gnueabi-gcc
4、安装:make install
5、拷贝:将gdbserver拷贝到开发板的/bin目录下
三、调试
1、编译要调试的应用程序:必须要加-g选项
按如下编译它 arm-arago-linux-gnueabi-gcc -g test.c -o test
将test 拷贝到开发板的/bin目录下
3、在ok335开发板上:
ifconfig eth0 192.168.2.79
gdbserver 192.168.2.79:2345 test
打印出如下信息:
root@ok335x:~# gdbserver 192.168.2.79:2345 usb &
[1] 1141
Process usb created; pid = 1144
Listening on port 2345
其中192.168.183.127:本开发板的ip
2345:端口号.
test:要调试的程序
4、在PC上:./arm-arago-linux-gnueabi-gdb /home/diske/home/machao/ok335/apps/tcu_usb-zidong-updates/usb
(gdb) set sysroot /home/diske/home/machao/ok335/rootfs/plugins/rootfs-qt/rootfs-qt
(gdb) target remote 192.168.2.79:2345
5、下面就可以正式调试了!我们先来说一下几个常用的命令
(1)l:列出所有源代码
(2)break main:在main处打断点
break test_debug.c:11:在test_debug.c的11行打断点
(3)c:运行到断点处
(4)step:单步执行
(5)next:单步执行,但是step会进入函数里面,但是next不会
(6)print a:打印a这个变量的值
(6)quit:退出,输入此命令则开发板上的gdbserver也退出
gdb常用命令:
指定调试文件:file
设置断点: break
运行程序:run
断点后继续运行: continue
单步调试:step
跳转到下个函数:next
显示动态库加载地址:info sharedlibrary
设置动态库加载路径:set solib-search-path
设置动态库绝对路径:set solib-absolute-prefix
显示所有寄存器值:info all-registers
(gdb) info all-registers
r0 0x0 0
r1 0xd1cfef78 3520065400
r2 0x0 0
r3 0x1 1
r4 0xd1cff440 3520066624
r5 0xe3e4b000 3823415296
r6 0x1 1
r7 0x0 0
r8 0x0 0
r9 0xe8bb3490 3904582800
r10 0xd1cff440 3520066624
r11 0xe3e4a41c 3823412252
r12 0x3d0f00 4001536
sp 0xe3e4a3a0 0xe3e4a3a0
lr 0xea81aa7c -360600964
pc 0xea81c714 0xea81c714
cpsr 0x600d0010 1611464720
显示所有参数:info args
显示所有线程:info threads
跳转到指定线程:thread
打印调用栈:bt或者info stack
打印所有线程调用栈:thread apply all bt
跳转到指定层级的调用栈:frame
反汇编:disassemble
打印栈数据
(gdb) x/64wx $sp
0xe342c548: 0x00000000 0xe342cb40 0x00000000 0x00000000
0xe342c558: 0x06f74f8f 0x0c6a543b 0xe342cb40 0xfff333f4
0xe342c568: 0x00000000 0x00000152 0x00000000 0xfff333f4
0xe342c578: 0x00000000 0xe342c67c 0x00000000 0x00000000
0xe342c588: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c598: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c5a8: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c5b8: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c5c8: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c5d8: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c5e8: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c5f8: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c608: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c618: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c628: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c638: 0x00000000 0x00000000 0x00000000 0x00000000
print(p)
list(l)
(gdb) run
Starting program: /usr/local/test
warning: Unable to fetch general register.
PC register is not available
-----ptrace(PTRACE_GETREGSET)失败
(gdb) set libthread-db-search-path
(gdb) set auto-load libthread-db [on|off]
(gdb) info auto-load libthread-db
No auto-loaded libthread-db.
(gdb) show auto-load libthread-db
Auto-loading of inferior specific libthread_db is on.
/lib/libthread_db.so.1软链接指向/lib/libthread_db-1.0.so
如果缺少该库,报错如下:
warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.
同时,要保证该库没有被strip过,因为需要nptl_version符号,否则会报错:
Unable to find libthread_db matching inferior's thread library, ...
(gdb) run
Starting program: /usr/local/test
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
Cannot find user-level thread for LWP 130: generic error