编译
-g
汇编
- 打印出错时的汇编代码片段,其中箭头指向的是出错的指令,即
PC 寄存器指向的地址,PC 寄存器存放的是下一条执行指令
- gdb 默认使用
AT&T 汇编语言格式打印汇编语句,设置为 intel 汇编语言格式
1
| (gdb) set disassembly-flavor intel
|
启动
调试可执行文件
调试正在运行的进程 👍
SIGPIPE
- 调试过程可能会因为 SIGPIPE 停止,可使用如下命令解决:
1
| (gdb) handle SIGPIPE nostop noprint pass
|
结束调试
命令行参数
set args
1
| (gdb) set args ../redis.conf
|
show args
流程控制
break
- 当变量 counter 的值为 100 时设置断点
1
| (gdb) break main.c:10 if counter == 100
|
tbreak
run
- 如果是通过
gdb <可执行文件> 的方式,可使用如下命令让程序运行起来:
或者:
continue
或者:
step
或者:
next
或者:
until 👍
finish 👍
watch
- 当
i 的值发生变化时,gdb 会中断程序的执行,并显示相关的调试信息
查看
bt
1 2
| (gdb) backtrace (gdb) bt
|
frame
print
查看变量
修改变量
修改长度限制 👍
字符串变量的长度可能会超过默认长度,如何查看完整的字符串?
1 2
| (gdb) show print elements Limit on string chars or array elements to print is 200.
|
1
| (gdb) set print elements 1000
|
1
| (gdb) set print elements 0
|
info
查看当前函数的参数
查看寄存器
查看所有线程
ptype
查看变量类型
display
修改
修改变量的值
1
| (gdb) set variable flag = 1
|
修改内存
- 将地址为
0x1000 处的内存内容设置为 0x55
1
| (gdb) set {int}0x1000 = 0x55
|
修改寄存器
多线程
获取所有线程的堆栈信息 👍
1
| (gdb) thread apply all bt
|
对指定的线程执行命令
1
| (gdb) thread apply <thread-id> <command>
|
查看当前程序中所有线程的信息
切换到指定的线程
1
| (gdb) thread <thread-id>
|
为指定的线程设置断点
1
| (gdb) break <function> thread <thread-id>
|
为指定线程的表达式设置监视点
1
| (gdb) watch <expression> thread <thread-id>
|
关闭调度器锁定,允许所有线程同时执行
1
| (gdb) set scheduler-locking off
|
将程序执行流锁定在当前线程
1
| (gdb) set scheduler-locking on/step
|
step 也是用来锁定当前线程,当且仅当使用 next 或 step 命令做单步调试时会锁定当前线程
- 如果使用
until、finish、return 等线程内调试命令,其他线程还是有机会运行的
多进程
查看当前值
1
| (gdb) show follow-fork mode
|
fork 之后 gdb attach 到父进程
1
| (gdb) set follow-fork parent
|
fork 之后 gdb attach 到子进程
1
| (gdb) set follow-fork child
|