启动

调试正在运行的进程

1
$ gdb attach <进程ID>

SIGPIPE

  • 调试过程可能会因为 SIGPIPE 停止,可使用如下命令解决:
1
(gdb) handle SIGPIPE nostop noprint pass

结束调试

  • 且不对当前进程有任何影响
1
2
(gdb) detach
(gdb) quit

流程控制

break

  • 在函数的开头设置断点
1
(gdb) break func_name
  • 在文件 main.c 的第 10 行设置断点
1
(gdb) break main.c:10
  • 当变量 counter 的值为 100 时设置断点
1
(gdb) break main.c:10 if counter == 100

tbreak

  • 设置临时断点(该断点触发一次后,就会自动被删除)
1
(gdb) tbreak func_name

run

  • 如果是通过 gdb <可执行文件> 的方式,可使用如下命令让程序运行起来:
1
(gdb) run

或者:

1
(gdb) r

continue

  • 运行到下一个断点
1
(gdb) continue

或者:

1
(gdb) c

step

  • 执行当前行,并进入函数调用
1
(gdb) step

或者:

1
(gdb) s

next

  • 执行当前行,不进入函数调用
1
(gdb) next

或者:

1
(gdb) n

until 👍

  • 让程序运行到 2774 行
1
(gdb) until 2774

finish 👍

  • 直接执行完当前函数,并回到上一层的调用处
1
(gdb) finish

查看

print

查看变量

  • i 是变量名
1
(gdb) print i

修改长度限制 👍

字符串变量的长度可能会超过默认长度,如何查看完整的字符串?

  • 查看长度限制
1
2
(gdb) show print elements
Limit on string chars or array elements to print is 200.
  • 将长度限制改为 1000
1
(gdb) set print elements 1000
  • 或者改为无限制
1
(gdb) set print elements 0

info

查看当前函数的参数

1
(gdb) info args

查看寄存器

1
(gdb) info registers

查看所有线程

1
(gdb) info threads

修改

修改变量的值

  • flag 的值修改为 1
1
(gdb) set variable flag = 1

多线程

获取所有线程的堆栈信息

1
(gdb) thread apply all bt