ok335使用gdb和gdbserver

一、调试原理

我们所说的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 或者up/down

反汇编:disassemble 如果不指定func则反汇编当前栈帧的函数

 

打印栈数据

(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

你可能感兴趣的:(笔记)