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 | 删除 |