在uClinux下利用GDB进行调试
2013-02-28 15:39
525 查看
环境:Blackfin uClinux(版本:buildroot-2012R1-RC6-BF60X)
Linux主机:ubuntu 10.04.4
可以通过串口和网络两种方式进行调试,以下示例以网络调试为例。
1. 在Linux主机编译应用程序:bfin-uclinux-gcc–g –o0 –o a.out test.c
-g :在可执行文件中加入调试信息,才能使GDB正常工作;
-o0 :将优化等级设置为0,以便于调试。
2. 在超级终端上将编译好的可执行文件a.out拷贝到uClinux根目录下:
ftpget -u joey -p 123456 192.168.1.159 a.out/mnt/hgfs/uClinux-code/ABC3000_src/a.out
赋予a.out可执行的权限:
chmod a+x a.out
在uClinux下启动gdbserver:
gdbserver localhost:3456 a.out(3456是端口,只要不与其它应用冲突,可改成任意端口)
3. 在Linux主机下面执行:bfin-uclinux-gdb a.out.gdb(a.out.gdb在编译时生成)
当GDB在主机下运行起来后,执行以下命令连接目标系统,即uClinux:
target remote 192.168.1.122:3456(192.168.1.122是uClinux的IP地址)
到了这一步,就可以进行调试了:
--------------------------------------------------------------------------------------------------------
以下表格是常用的GDB命令:
更详细的内容请见:http://docs.blackfin.uclinux.org/doku.php?id=debuggers&s[]=gdb
Linux主机:ubuntu 10.04.4
可以通过串口和网络两种方式进行调试,以下示例以网络调试为例。
1. 在Linux主机编译应用程序:bfin-uclinux-gcc–g –o0 –o a.out test.c
-g :在可执行文件中加入调试信息,才能使GDB正常工作;
-o0 :将优化等级设置为0,以便于调试。
2. 在超级终端上将编译好的可执行文件a.out拷贝到uClinux根目录下:
ftpget -u joey -p 123456 192.168.1.159 a.out/mnt/hgfs/uClinux-code/ABC3000_src/a.out
赋予a.out可执行的权限:
chmod a+x a.out
在uClinux下启动gdbserver:
gdbserver localhost:3456 a.out(3456是端口,只要不与其它应用冲突,可改成任意端口)
3. 在Linux主机下面执行:bfin-uclinux-gdb a.out.gdb(a.out.gdb在编译时生成)
当GDB在主机下运行起来后,执行以下命令连接目标系统,即uClinux:
target remote 192.168.1.122:3456(192.168.1.122是uClinux的IP地址)
到了这一步,就可以进行调试了:
--------------------------------------------------------------------------------------------------------
以下表格是常用的GDB命令:
命令 | 效果 |
开始与停止 | |
quit | 退出GDB |
run | 运行程序(后面可以开命令行参数) |
kill | 停止程序 |
断点 | |
break sum | 在函数sum的入口处设置断点 |
break *0x80483c3 | 在地址0x80483c3处设置断点 |
delete 1 | 删除第1个断点 |
delete | 删除所有断点 |
执行 | |
stepi | 执行一条指令(逐语句,会进入函数) |
stepi n | 执行n条指令(逐语句) |
nexti | 类似于stepi(逐过程,不会进入函数) |
continue | 继续执行 |
finish | 运行至当前函数返回 |
检查代码 | |
disas | 反汇编当前函数 |
disas sum | 反汇编函数sum |
disas 0x80483b7 | 反汇编地址0x80483b7附近的代码 |
disas 0x80483b7 0x80483c7 | 反汇编两地址之间的代码 |
print /x $pc | 以十六进制形式打印程序计数器 |
list | 列出源代码 |
list n | 列出第n行附近的源代码 |
检查数据 | |
print $r0 | 以十进制打印r0的值 |
print /x $r0 | 以十六进制打印r0的值 |
print /t $r0 | 以二进制打印r0的值 |
print 0x100 | 打印0x100的十进制形式 |
print /x 1024 | 打印1024的十六进制形式 |
print /t 1024 | 打印1024的二进制形式 |
print /x ($pc+8) | 以十六进制形式打印寄存器pc内容+8 |
print *(int *) 0xbffff890 | 打印地址0xbfffff890中的整数 |
print *(int *) ($pc +8) | 打印地址%pc+8中的整数 |
有用的信息 | |
info frame | 当前栈桢的信息 |
info registers | 所有寄存器的信息 |
help | 获取GDB的信息 |
相关文章推荐
- 利用GDB在远程开发机进行调试
- 利用GDB进行多线程调试
- 利用GDB进行多线程调试
- 利用GDB进行多线程调试
- 利用GDB进行远程调试
- 利用Genymotion + vs + VisualGDB + ndk 进行源码调试(效率堪比真实调试)
- 利用GDB对程序进行调试
- 利用终端进行GDB调试
- 利用GDB进行多线程调试
- 利用GDB进行多线程调试
- 利用GDB进行多线程调试
- 利用GDB进行多线程调试
- 利用GDB在远程开发机进行调试
- 利用gdb在汇编指令级调试C程序
- 利用WIFI(不用数据线)连接Android手机进行调试
- 【嵌入式Linux学习七步曲之第二篇 ARM+Linux开发环境】gdb+gdbserver的方式进行ARM程序调试
- 利用GDB调试多线程core文件
- Android驱动利用sys节点进行调试
- 使用 gdb 对程序进行汇编级调试
- 利用BDI实现GDB调试