ddddfang's Blog.

gdb

字数统计: 685阅读时长: 2 min
2019/01/22 Share

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指令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 啦

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
2
3
4
5
6
7
8
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 install

CATALOG
  1. 1. 1. gdb基本使用
  2. 2. 2. 交叉编译gdb