? 跟踪程序执行
? 恢复程序崩溃前的状态
? gdb是动态的工具,常用的addr2line这种是静态的
1. 自定义程序的启动方式(执行影响程序运行的参数)
2. 设置条件断点 (在条件满足的时候暂停程序的执行)
3. 回溯检查导致程序崩溃的原因(Core Dump)
4. 改变程序的执行流 (定位问题的辅助方式)
启动
gdb
file 可执行程序
gdb 可执行程序
gdb 可执行程序 CoreDump
直接恢复发生段错误的信息
动态链接
sudo gdb 可执行程序名称 pid
sudo gdb
attach pid
常规启动
gdb
file 可执行程序
set args arg1 arg2
run
gdb
attach pid
continue
ulimit -c unlimited
gdb a.out core
### 1. 类型
? 软件断点: 由非法指令异常实现,用于执行于内存中的程序
? 硬件断点: 由硬件特性实现,用于执行于Flash中的程序(代码处于Flash中只能通过硬件断点调试)
? 数据断点:由硬件特性实现,监控内存 程序中 某个数据被访问/修改
通过函数名
break func_name [if var = name]
后面的代表是条件断点可以增加的条件,[]可以忽略
tbreak func_name [if var = name]
临时断点
hbreak func_name [if var = name]
硬件断点
break file_name:line_num [if var = name]
treak file_name:line_num [if var = name]
hreak file_name:line_num [if var = name]
info breakpoints
delete 1 2 n
delete breakpoints
enable 1 2 n
enable breakpoints
disable 1 2 n
disable breakpoints
? 一般打断点都会出现下面的信息,代表 printf("st[%d].i = %d\n", i, st[i].i);代表下一次要执行的语句,当前停在这里还没执行
? Breakpoint 4, func () at tricks.c:24
? 24 printf("st[%d].i = %d\n", i, st[i].i);
查看变量
print name
start
set var xx=100
next
next n
step
return value
finish
until line
jump line
show can-use-hw-watchpoints
本质为硬件断点
用法
watch var_name
语法
x /Nuf expression
N — 需要打印的单元个数
u — 每个单元的大小
f — 数据打印的格式
b 单字节
h 双字节
w 四字节
g 八字节
x 十六进制
d 有符号十进制
u 无符号十进制
o 八进制
t 二进制
a 地址
c 字符
f 浮点数
x /4bx 0x804a024
? set var i = 1
? print /a &var
? x /4bx a地址
? x /1bx a地址 看看是不是1
? 函数调用栈顺序
? backtrace
? frame N
? info frame
查看当前寄存器的值
info registers
info args
info locals
info frame
info variables
info functions
断点处自动打印
display /f expression
undisplay
whatis
ptype 会把符号怎么定义的也显示,whatis不会
list 默认显示10
list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12
list 函数名:将显示“函数名”所在函数的源代码,如:list main
shell
原文:https://www.cnblogs.com/zero-waring/p/14729696.html