编译带调试信息的程序
# 禁用编译器优化,便于查阅代码时对齐
gcc -g hello.c -o hello -O0
# 移除调试信息
strip hello
启动调试
- 调试未启动的程序
gdb hello
- 调试已启动的程序
# 获取进程PID
ps -ef | grep hello
# attach 进程
gdb attach 进程PID
# 结束调试,gdb和程序分离,程序继续运行
detach
quit
常用命令
-
tbreak
添加一个临时断点,断点一旦被触发就会被自动删除 -
backtrace(bt)
查看当前所在线程的调用堆栈 -
frame
切换堆栈编号frame 堆栈编号
,查看调用关系 -
info break
查看断点信息 -
enable、disable、delete
启用,禁用,删除断点,命令后面如果不加编号则作用于所有断点 -
list(l)
查看当前断点处附近的代码,也可以查看某文件某一行的代码。list -
从当前位置向前显示10行代码 -
print(p)
输出变量的值,也可以输出特定表达式的值,或者函数执行的结果;也可以修改变量的值
p server.port # 打印
p server.port=1080 # 修改值
-
info threads
查看当前进程的所以线程信息 -
thread
切换到某一线程thread 2
-
info args
打印线程中断处调用函数参数的值 -
next
-
step
-
finish、return
- finish 执行完整的函数体,正常返回上层调用
- return 从函数当前位置立即返回上层,不执行剩余代码
-
until(u)
运行到指定的行 -
disassemble
输出当前函数的汇编指令,默认格式为AT&T
格式
# intel 汇编格式
set disassembly-flavor intel
disassemble
- watch
监视一个变量或者一段内存,当变量或者内存处值发生变化,gdb就会中断。当观察点是局部变量时,局部变量失效后,观察点也会失效。
int i
watch i
char *p
watch p # p本身 *(&p)
watch *p # p所指的内存的值
char buf[128]
watch buf