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 | 单步运行(函数作为整体一条语句) |
step | step 单步运行(进入函数) |
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指令lsinfo 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) #调试过程中强制调用某个函数(并返回)
本文介绍GDB的基本使用方法,包括设置断点、单步执行、查看调用栈等技巧,以及如何通过交叉编译在目标板上进行应用程序的调试。还提供了在gdb中使用条件断点、查看变量值、处理信号等高级功能。
2962

被折叠的 条评论
为什么被折叠?



