一. 加入调试信息
gcc -g *.c
二. 启动 gdb
1. 启动新进程
gdb a.out
run 参数1 参数2
2. 调试已有进程
gdb -p 进程号
三. 断点
b 行号/函数名/文件名:行号
info b 查看已经设置的断点
continue 运行到下一个断点
delete/clear 删除断点
四. 断点保存
编辑文件例如 break 并输入中断点:
br main
保存后, gdb 可执行文件 -x break 即可自动设置断点
五. 条件断点
b 行号/文件名:行号 if 表达式 if 后无需括号
condition 断点号 expression 修改表达式
condition 断点号 删除表达式
六. 跟踪
la(layout) 显示源码
print 变量
p\x 变量 以十六进制查看
next 执行下一行语句,如果是函数,不进入
step 执行下一行语句,如果是函数,进入
七. 调试线程
info threads 显示当前可调试的所有线程
break thread_test.c:123 thread all 在所有线程中相应的行上设置断点
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。
thread apply all command 让所有被调试线程执行GDB命令command。
set scheduler-locking off|on|step 实际使用过多线程调试的人都可以发现,在使用 step 或者 continue 命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了 next 过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后 continue 的行为)以外,只有当前线程会执行。
non-stop mode:For some multi-threaded targets, gdb supports an optional mode of operation in which you can examine stopped program threads in the debugger while other threads continue to execute freely. This minimizes intrusion when debugging live systems, such as programs where some threads have real-time constraints or must continue to respond to external events. This is referred to as non-stop mode.
启动命令参考:gdb -iex "set target-async on" -iex "set pagination off" -iex "set non-stop on" ...
参考:http://sourceware.org/gdb/download/onlinedocs/gdb/Non_002dStop-Mode.html#Non_002dStop-Mode