gdb 调试利器
最后更新于:2022-04-02 03:50:04
[TOC]
> [参考](https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html)
## 概述
qdb 支持调试的语句
* Ada
* Assembly
* C
* C++
* D
* Fortran
* Go
* Objective-C
* OpenCL
* Modula-2
* Pascal
* Rust
## 安装
```
yum install gdb
```
## 语法
```
// 源码
list l 出源码
l num 列出 num 行前后的源码
l fun 列出方法 fun 的源码
l start_num, end_num
l file_name:fun_name
set listsize count 设置一次显示多少行源码(默认为10)
show listsize 显示listsize
directiory dir_name 简写 dir dir_name , 将指定的目录加入源码文件的前缀
show dir 显示目录前缀
// 断点和监视
break fun_name b fun_name 在 fun_name 处打断点
b line_number 在 line_number 处打断点
b +offset 在offset 行后加断点
b -offset 同上
b file_name:fun_name 文件的方法名处打断点
b fine_name:line_number 同上
b *address 在某地址处打断点。适用于没有源码的情况
b line_number if condition 条件断点。 当条件为 true 时会中断
tbreak n tb n 单次命中断点。 如 tb 12 表示只会在第12行命中一次
// 监视
watch var 监视var变量
watch condition 带条件的监视。如 watch a>1
// 删除和禁用断点
clear 清除当前行的断点
clear fun_name 清除 fun_name 中的所有断点
clear line_number 删除该行的断点
delete d 删除所有的 breakpoints, watchpoints, or catchpoints.
d num 删除序号为 num 的断点
d num1-num2 删除序号从 num1 到 num2 的所有断点
disable/enable num 禁用/启用序号为 num 的断点
disable/enable num1-num2 禁用/启用 序号从 num1到 num2 的断点
// 调试
run r 运行程序
step s 步进调试,可以进入方法
next n 步进调试,不会进入方法
finish 跳出当前方法
until line-number 运行到 line-number 行
where 显示当前行数和方法
bt full 打印完整的栈信息
frame f 显示当前栈的 frame 信息
f number 选择frame
up / down / up number /down number 选择 frame
// 变量
print var 简写 p var 打印变量var
p file_name:var
p/x var 以16进制打印整型变量 。
p/d var 10进制
p/u var unsigned int
p/o var 8进制
p/t var 2进制 (1byte/8bits)
p/c var 以字符形式
p/f var 以 floating 形式
p/a var 以十六进制地址
x/4b &var 以 4 byte 打印var 的内存
ptype var 显示var 的类型
ptype date-type 显示原类型
// 启动
run r
continue c
kill 杀掉当前调试的程序
quit q 退出
// 信息
info args 列出参数
info breakpoints info break i b 列出所有断点
info break number i b number 列出序号为 number 的的断点
info watchpoints i watchpoints 列出所在 watchpoints
info threads 列出所有线程
inifo registers 列出寄存器的值
info set 列出当前 gdb的所的设置
i frame
i stack 列出堆栈信息
i locals // 列出当前变量
i catch
// 多窗口
layout 用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法:
layout src 显示源代码窗口
layout asm 显示汇编窗口
layout regs 显示源代码/汇编和寄存器窗口
layout split 显示源代码和汇编窗口
layout next 显示下一个layout
layout prev 显示上一个layout
Ctrl + L:刷新窗口
Ctrl + x,再按1: 单窗口模式,显示一个窗口
Ctrl + x,再按2: 双窗口模式,显示两个窗口
Ctrl + x,再按a: 回到传统模式,即退出layout,回到执行layout之前的调试窗口。
```
## 启动
方式一:
`gdb `
方式二:
`gdb `
## 示例
### 查看可以源码调试
方式一:
没有源码调试
```
> db main
Reading symbols from /root/main...(no debugging symbols found)...done.
```
有源码调试
```
> db main
Reading symbols from /root/main...done.
```
方式二:
没有源码调试
```
> readelf -S main|grep debug
没有输出
```
有源码调试
```
> readelf -S main|grep debug
[27] .debug_aranges PROGBITS 0000000000000000 00001059
[28] .debug_info PROGBITS 0000000000000000 00001089
[29] .debug_abbrev PROGBITS 0000000000000000 00001140
[30] .debug_line PROGBITS 0000000000000000 00001193
[31] .debug_str PROGBITS 0000000000000000 000011d7
```
### 简单调试
创建一个 main.c
```
#include
int main ()
{
unsigned long long int n, sum;
n = 1;
sum = 0;
while (n <= 100)
{
sum = sum + n;
n = n + 1;
}
return 0;
}
```
编译
```
gcc -o main -g main.c
```
> 注意编译需要加上 -g 才能用gdb 展示源码
```
> gdb main
> layout // 展示源码窗口
> l // 显示源码
> b n // 在第n行打断点
> r // 执行
```
';