注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天道酬勤 玩物丧志

用勇气去改变可以改变的事情,用胸怀去包容无法改变的事情,用智慧去判断两者的区别

 
 
 

日志

 
 

cygwin下安装gdb任务调试arm平台qemu  

2016-06-25 17:52:30|  分类: GCC |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
上一篇中我们搭建了windows环境下的ARM平台QEMU虚拟机,下面介绍一下利用gdb来调试运行在arm平台qemu上的程序。
gdb任务调试需要gdb(客户端)和gdbserver(服务端一般运行在目标机上),qemu本身提供了gdbserver,只需要在qemu虚拟机启动时添加gdb相关命令就能启动gdbserver,我们参考qemu-systrem-arm -h帮助中的说明:
-S              freeze CPU at startup (use 'c' to start execution)让程序加载后就停下来等待gdb连接上c命令运行
-gdb dev        wait for gdb connection on 'dev'
-s              shorthand for -gdb tcp::1234
例如:qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel reworks.elf  -gdb tcp::1234 -S
或者:qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel reworks.elf -s -S

接下来就需要通过gdb客户端来连接gdbserver调试。由于cygwin默认安装的gdb是x86平台的(通过gdb -configuration可查看到--target=i686-pc-cygwin)无法正常调试arm平台的程序,因此需要重新编译arm平台的gdb。
我的方法是通过cygwin安装下载gdb的src,在选择安装时搜索gdb关键字,在Devel下有gdb勾选src则会将gdb-7.10.1.tar.xz下载到cygwin的usr\src\gdb-7.10.1-1.src目录下,解压后进入其文件
./configure --target=arm-elf --prefix=/opt/arm-gdb
(这里没有指定host,默认为--host=i686-pc-cygwin
--target=arm-elf为指定的目标平台,一般使用所需调试的应用程序编译所用的工具链平台,参考gcc支持的target,例如有:
--target=armv5-linux-uclibc
targetarmlinux
--target=arm-linux-gnueabi
 --prefix=/opt/arm-gdb指定的是要安装的目录
make
make install
安装好后需要添加/opt/arm-gdb/bin到环境变量PATH中,例如:在/etc/profile文件中添加
export PATH=$PATH:/opt/arm-gdb/bin

然后就可以通过gdb,例如:gdb zgdb.obj
我们前面编译gdb用的--target=arm-elf,因此生成的是arm-elf-gdb,使用时:arm-elf-gdb zgdb.obj
(zgdb.obj中包含有-g编译的调试信息、符号表信息)
进入到gdb命令行下运行:
target remote localhost:1234
即可链接上正在等待调试的gdbserver
然后就可以打断点、单步、运行任务调试

附1:GDB的基本指令:

   load:装入一个程序
   symbol-file:装入符号库文件,可以是用-g参数编译的可执行文件。
   f(ile):指定一个可执行文件进行调试,gdb将读取些文件的调试讯息,如f a.exe
   l(ist):列程序出源文件
   r(un) :装载完要调试的可执行文件后,可以用run命令运行可执行文件
   b(reak):设置断点(break point),如b 25,则在源程序的第25行设置一个断点,当程序执行到第25行时,就会产生中断;也可以使用b funcname,funcname为函数的名称,

当程序调用些函数时,则产生中断
   c(ontinue):c命令可以另中断的程序继续执行,直到下一个中断点或程序结束
   p(rint):输入某个变量的值,如程序定义了一个int aa的就是,p aa就会输出aa的当前值
   n(ext):程序执行到断点时中断执行,可以用n指令进行单步执行
   s(tep):程序执行到断点时中断执行,可以用s指令进行单步执行进某一函数
   q(uit):退出GDB

参考:
  评论这张
 
阅读(111)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018