GDB移植及调试
一、GDB移植
1.1、下载GDB源码
下载地址:http://ftp.gnu.org/gnu/gdb/
选择gdb-8.2.1.tar.gz版本下载
tar -zxvf gdb-8.2.1.tar.gz
-z表示解压gz包 -x表示解压 -v表示详细过程 -f表示文件
解压后可在当前目录看到压缩包同名文件夹
1.2、添加交叉编译工具链
./configure --host=arm-linux-gnueabihf --enable-shared --prefix=$PWD/output/arm --without-x
--disable-gdbtk --disable-tui --without-included-regex --without-included-gettext
--host=arm-linux-gnueabihf 指定编译器
--enable-shared 动态编译
--prefix="$PWD/../output/arm生成的目录文件
--without-x 取消x windows 支持
--disable-gdbtk 取消gdbtk,应该也是图形界面相关的
--disable-tui 取消tui 界面
--without-included-regex 关闭正则表达式库
--without-included-gettext 去掉用于多语言处理gettext库
1.3、编译及操作
make
make install
make 编译
make install 安装
二、GDB调试
2.1、常见指令
2.1.1、 开始|停止|复位
| 命令 | 描述 |
|---|
| s(start) | 执行程序,并停在main函数第一条语句前 |
| r(run) | 连续执行程序,直到断点 |
| c(continue) | 继续执行程序,直到断点 |
2.1.2、基本命令
| 命令 | 描述 |
|---|
| backtrace(或bt) | 查看各级函数调用及参数 |
| finish | 连续运行到当前函数返回为止,然后停下来等待命令 |
| list(或l) | 列出源代码,接着上次的位置往下列,每次列10行 |
| list 行号 | 列出从第几行开始的源代码 |
| list 函数名 | 列出某个函数的源代码 |
| next(或n) | 执行下一行语句 |
| print(或p) | 打印表达式的值,通过表达式可以修改变量的值或者调用函数 |
| quit(或q) | 退出gdb调试环境 |
| step(或s) | 执行下一行语句,如果有函数调用则进入到函数中 |
| wath | 观察一个变量 |
| current | 跳转到下个断点,或则跳转到观察点 |
| set var 变量名=变量值 | 修改变量值 |
2.1.3、单步调试
| 命令 | 描述 |
|---|
| b(break) n | n行设置断点,永久生效 |
| b 函数名 | 函数设置断点 |
| tb(tbreak) | 临时断点,阅后即焚的效果 |
| ****if 条件 | if表示设置条件断点,只有条件为真时,才中断,结合其他断点设置语法使用.eg:b 10 if i99,即10行的断点,如果变量i99,才生效 |
| i(info) breakpoints | 查所有的断点 |
| delete breakpoints n | 删除n号断点,其中n为断点的序列号,可以用info breakpoints查看 |
| disable breakpoints n | 失能n号断点 |
| enable breakpoints n | 使能n号断点 |
2.1.3、信息打印
| 命令 | 描述 |
|---|
| i(info) 变量名 | 查看一个变量的值 |
| i locals | 查看所有局部变量的值 |
| p(print) 表达式 | p 变量名=变量值,修改变量值 |
| p 变量 | 查看变量值 |
| display 变量名 | 使得程序每次停下来都会显示变量的值,取消显示,使用>undisplay 序号,序号可通过 >info display 查看 |
| bt(backtrace) | 查看函数调用栈 |
| frame n | n为栈的层次,然后可以用其他命令(info)查看此级别的变量信息 |
| x/nfu | 查看从变量名开始的n个字节,例x/7bx input 表示查看从变量input开始的7个内存单元的内容 |
2.1.4、观察点管理
| 命令 | 描述 |
|---|
| watch 变量名 | 当程序访问变量名指定的内存单元时,停止程序 |
| info watchpoints | 查看 |
| delete watchpoints | 删除 |