gdb使用

本文介绍GDB的基本使用方法,包括设置断点、单步执行、查看调用栈等技巧,以及如何通过交叉编译在目标板上进行应用程序的调试。还提供了在gdb中使用条件断点、查看变量值、处理信号等高级功能。

1. gdb基本使用

要编写debug版本才可以使用gdb跟踪,即使用gcc编译的时候应该加上 -g -O0 -Wall 选项,而不是-O2

命令说明
gdb audiodrvtest开始使用gdb调试程序audiodrvtest
b zx_audio_driver.c: 353在zx_audio_driver.c文件的353行加一个断点
b ZX_AudioDrvDecClose在ZX_AudioDrvDecClose函数开始的地方也加上一个断点
b if a=100条件断点,当变量a为100的时候会停住
info b查看断点信息
delete xx删除第xx个断点
clear ZX_AudioDrvDecClose清掉设在ZX_AudioDrvDecClose入口的那个断点(zx_audio_driver.c:353同理,不加参数则清掉所有断点)
r ../CCTV.ts使用../CCTV.ts作为参数run!
n单步运行(函数作为整体一条语句)
stepstep 单步运行(进入函数)
finish跳出这个函数继续执行
bt查看当前函数调用栈(目前所在的函数就是frame 1位置)
f xx进入函数调用栈的第xx层,然后就可以进入那一层函数的环境了(这招对于返回上层函数,查看本函数的调用函数的环境很有用)
p xx打印变量的值(包括全局变量和所处函数的local变量)
p *pt@len查看指针pt开始的len个元素的值(如果元素为char型那就len个bytes)
p /x abc以16进制格式打印变量 abc。 /t 以二进制方式打印,/o 以8进制方式打印变量
q退出gdb调试
  • shell ls 在gdb下执行shell指令ls
  • info args 查看当前函数的参数值
  • info locals 查看当前函数的所有local变量
  • info thread 查看当前进程包含的线程数目,以及当前处于哪个thread中
  • handle SIGPIPE nostop noprint 告诉gdb遇到SIGPIPE信号的时候不要停也不要打印
    PS: 我们通常跑的程序运行过程中 ctrl+c 会直接停止掉(因此最好加上对ctrl+c的捕获并处理),但是在gdb中,ctrl+c就真的只是暂停了而已,此时再 输入 c 程序就会 continue 啦
  • (gdb) watch *地址    # 当地址所指内容发送变化时断点
    (gdb) watch var    #当var值变化时,断点
    (gdb) watch (condition)    #当条件符合时,断点

2. 交叉编译gdb

使用交叉编译工具链编译得到了kernel,
使用交叉编译工具链得到了bsp/app,
现在我想在目标板上使用gdb调试app怎么办?使用gdb源码交叉编译一个,参考

1.下载gdb源码 Mirror sites –> Finland: ftp.funet.fi (ftp) –> /mnt/hgfs/shareLinux/gdb-8.0.1.tar.gz
2.sudo apt-get install texinfo

3.gdb源码修改:

vim ./gdb/common/gdb_assert.h +26

将 #define gdb_static_assert(expr) \
    extern int never_defined_just_used_for_checking[(expr) ? 1 : -1]

修改为:
  #define gdb_static_assert(expr) \
    extern int never_defined_just_used_for_checking[(1) ? 1 : -1]


4.(我的交叉编译工具链是 arm-linux-gnueabihf-xxx)

./configure –host=arm-linux-gnueabihf –target=arm-linux-gnueabihf –prefix=/root/gdb-src/gdb-8.0.1/obj/
make
make instal

TIPS:

1. gdb调试带参数的binary,还可以直接 # gdb --args bin args

2. 进入gdb后希望显示代码上下文,可以 (gdb) focus 或者 运行gdb的时候gdb -tui --args bin args

3. gdb一个极为有用的命令是attach。某个ap跑起来后,卡在了不知什么地方,可以先ps aux查看程序的pid,然后gdb attach <pid>接管,bt便可查看当前ap所在位置。q则自动de-attach

(gdb)set variable abc=123     #调试的时候强制设置某个变量的值,注意要在该变量已经创建且可见
(gdb)jump abc.c:xx     #调试过程中修改pc指针,强制跳转到某个文件的某个位置并继续运行(若想停住则提前打断点)
(gdb)call func(&ttt)    #调试过程中强制调用某个函数(并返回)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值