gdb是一个方便的终端调试工具,能够调试多种语言代码
导图:
graph LR GDB ---> 编译debug版本程序 GDB ---> 启动调试界面 GDB ---> 调试 调试 ---> 设置断点 调试 ---> 执行 调试 ---> 查看信息 查看信息 ---> 变量 查看信息 ---> 调用堆栈
编译为debug版本,需要在gcc是使用-g
参数
1 | gcc bugging.c -o bugging -g |
启动gdb进入调试界面
1 | gdb bugging |
gdb常用命令表
命令 | 简写形式 | 说明 |
---|---|---|
list | l | 查看源码 |
backtrace | bt,where | 打印函数栈信息 |
next | n | 执行下一行 |
finish | 运行到函数结束 | |
continue | c | 继续运行 |
break | b | 设置断点 |
info breakpoints | 显示断点信息 | |
delete | d | 删除断点 |
p | 打印表达式信息 | |
run | r | 启动程序 |
until | u | 执行到指定行 |
info | i | 显示信息 |
help | h | 帮助信息 |
可以通过!shell
执行shell命令
查看源码
list(l)查看源码信息,主要有以下几种方式
- list 行号,显示某一行附近的代码
- list 文件名:行号,显示某一个文件某一行附近代码
- list 函数名,显示某个函数附近代码
- list 文件名:函数名,显示某个文件某个函数
断点
设置断点
break(b)用来设置断点,常用操作如下
- break 行号
- break 文件名:行号
- break 函数名
- break 文件名:函数名
查看断点信息
info breakpoints 查看断点信息,主要返回以下信息
- Num 断点标号,可以作为delete、enable、disable命令的参数控制断点
- Type 断点类型
- Disp 代表断点命中后是删除(del)还是保留(keep),或者关闭(dis)
- Enb 表示断点是enable(y),还是disable(n)
- Address 表示断点的虚拟内存的地址
- What 表示断点在源文件中信息
删除断点
delete Num 删除指定断点,delete 删除所有断点
关闭和启用断点
(disable|enable) [Num]
断点的方式
- enable once Num,断点hit一次后关闭
- enable delete Num,断点hit一次后删除
断点调试的一些命令
- 打印变量
- info locals 打印所有局部变量
- print 变量或者表达式
- 启动程序
- run
- run 参数,会传递给main函数
- 单步命令
- next 单步执行,next N执行N步
- step 单步执行会进入函数内部,step N执行N次
- finish 执行到当前函数结束
- continue 执行到下个断点
- until N 执行到某一行
函数栈
进程在内存空间会拥有一块叫做 stack 的区域,函数内部的局部变量、函数之间调用时参数的传递和返回值等等都会用到栈这种数据结构。
info proc mappings 可以查看进程的内存分布情况
backtrace 查看函数调用栈的情况
backtrace、where、info stack
这三个命令都能查看函数调用情况
backtrace full、where full、info stack full
这三个命令查看函数调用情况的同时,打印所有局部变量的值
stack frame
按调用顺序排,越大越先调用
info frame Num
查看某个函数栈的详细信息,寄存器、程序计数器等