11---
22title : gdb教程
3- published : 2025-02-10
3+ published : 2025-02-24
44description : gdb 命令
5- # image: ./cover.jpg
5+ image : ./images/cover1.png
66tags : [gdb, 教程]
77category : 调试工具
8- draft : true
8+ draft : false
99---
1010
11- ## breakpiont
11+ ## ⚡ 断点调试(Breakpoints)
1212``` sh
13- b filename.cpp:10
14- info b
15- d 1
16- disable 1
17- enable 1
13+ b filename.cpp:10 # 在filename.cpp的第10行设置断点
14+ info b # 查看所有断点信息
15+ d 1 # 删除编号为1的断点
16+ disable 1 # 临时禁用1号断点
17+ enable 1 # 重新启用1号断点
1818```
19- ## watch
19+ ## 🕵️♂️ 观察点(Watchpoints)
2020``` sh
2121 info wat
2222 watch variable_name
2323 wa # (监视Race共享变量)
24- wa buf if buf == nullptr
24+ wa buf if buf == nullptr # 条件监视:当buf为null时触发
2525 wa -location & shell.edit_pos
26- (gdb) commands
26+ (gdb) commands # 自定义观察点行为
2727 > printf " x=%d at %s:%d\n" , x, $_sargv [1], $bpnum # 用户态$_sargv[1]
2828 > continue
2929 > end
3030` ` `
31- # # run
31+ # # 🚀 程序运行控制( run)
3232` ` ` sh
33- start
34- r
35- n
36- s
37- si
33+ start # start 开始调试,在main函数处暂停
34+ r # run 开始/继续运行程序
35+ n # next 执行下一行(不进入函数)
36+ s # step 执行下一行(进入函数)
37+ si # step i 执行下一行指令(asm)
3838
39- finish
40- c
41- q
39+ finish # finish 执行完当前函数并暂停
40+ c # continue 继续运行直到下一个断点
41+ q # quit 退出GDB
4242` ` `
43- # # info
43+ # # 📊 信息查看与变量检查( info / print)
4444` ` ` sh
45- info b
46- info rec
45+ info b # 查看断点
46+ info rec # 查看 record
4747
4848 info v
49- info locals
49+ info locals # 查看当前栈帧的局部变量
5050
51- p variable_name
51+ p variable_name # 打印变量值
5252 p & rax
53- display
54- list
53+ display var # 每次暂停自动显示变量
54+ list # 显示当前位置的源代码
5555
56- info registers
56+ info reg # 查看寄存器值
5757 info threads
5858 thread 2
5959
@@ -62,7 +62,7 @@ draft: true
6262 > continue
6363 > end
6464` ` `
65- # # layout
65+ # # 🖥️ 界面布局控制( layout)
6666` ` ` sh
6767 la src
6868 la asm
@@ -76,43 +76,65 @@ draft: true
7676 Ctrl X + 2
7777 Ctrl X + A
7878` ` `
79- # # record
79+ # # ⏪ 执行记录与回放( record)
8080` ` ` sh
81- rec full
82- rec stop
83- info rec
84- rs
85- rsi
81+ rec full # 开始记录完整执行历史
82+ rec stop # 停止记录
83+ info rec # 显示记录信息
84+ info fds # 显示当前进程打开的文件描述符
8685
87- rec save filename
88- rec restore filename
86+ rec save trace.gdb # 保存执行记录
87+ rec restore trace.gdb # 载入执行记录
8988
89+ rs # 反向单步执行
90+ rsi # 反向单条指令执行
9091 rec goto begin
9192 rec goto end
92- rec goto 1
93+ rec goto 1 # 跳转到执行历史中的第15步
9394 rec delete
9495` ` `
95- # env
96+ # # 🔧 环境变量设置( env)
9697` ` ` sh
97- set $source_file = " mysh.cpp"
98+ set $source_file = " mysh.cpp" # 定义自定义变量
99+ set environment LD_PRELOAD=mylib.so # 设置环境变量
98100` ` `
99- # 并发
101+ # # 🧵 并发调试技巧
100102` ` ` sh
101- thread id
102- info threads
103- set follow-fork-mode child # (自动追踪fork出的子进程)
104- set detach-on-fork off + inferior
103+ thread id # 切换到线程id
104+ info threads # 查看所有线程
105+ b worker.cpp:20 thread 2 # 断点调试
106+ # 双进程调试模式
107+ set detach-on-fork off # 同时保留父子进程的调试控制
108+ inferior id # 切换到进程id
109+ info inferiors # 查看所有进程
105110
106- set follow-exec-mode new
111+ # fork()处理策略
112+ set detach-on-fork off + inferior # 保留所有fork进程
113+ set follow-fork-mode child # 自动追踪fork出的子进程,(默认parent)
114+ # execve()处理
115+ set follow-exec-mode new # exec函数族创建一个新进程,(默认same)
107116
108- info fds
117+ # 信号处理
118+ handle SIGINT print stop # 捕获SIGINT信号
119+ signal SIGINT # 手动发送信号(调试信号处理器)
120+ # 捕获特定系统调用
121+ catch syscall setpgid # 拦截进程组设置调用
122+ catch syscall tcsetpgrp # 拦截终端控制权转移
123+ call (int)tcgetpgrp(0) # 检查当前终端前台进程组
124+ p setsid () # 创建新会话(验证会话行为)
109125
110- handle SIGINT print stop
126+ # 自定义
111127 catch syscall setpgid
112- catch syscall tcsetpgrp
113- call (int)tcgetpgrp(0)
114- signal SIGINT
128+ commands
129+ printf " setpgid(%d, %d) by pid=%d\n" , $rdi , $rsi , $rax
130+ continue
131+ end
115132
116133 break close
117- bt # (程序崩溃/未预期行为/定位线程状况/)
134+ commands
135+ printf " Closing fd=%d\n" , (int)$rdi
136+ backtrace
137+ continue
138+ end
139+ bt # 打印当前线程的调用栈 (程序崩溃/对未预期行为/定位线程状况/...)
118140` ` `
0 commit comments