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 啦
2. 交叉编译gdb
使用交叉编译工具链编译得到了kernel,
使用交叉编译工具链得到了bsp/app,
现在我想在目标板上使用gdb调试app怎么办?当然是使用gdb源码交叉编译一个啦,参考
1.下载gdb源码 https://sourceware.org/mirrors.html –> Finland: ftp.funet.fi (ftp) –> /mnt/hgfs/shareLinux/gdb-8.0.1.tar.gz
2.sudo apt-get install texinfo
3.gdb源码修改:
1 | vim ./gdb/common/gdb_assert.h +26 |
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 install