Skip to content

GDB 多线程调试

断点

  1. 建立断点:
bash
# 使用函数名创建
(gdb) b func_name
Breakpoint 3 at 0x5555555575f9: **.cpp, line 179.

# 指定代码行数
(gdb) b **.cpp:179 # 这里要用绝对路径
Breakpoint 4 at 0x5555555575f9: **.cpp, line 179.
  1. 查看断点信息:
bash
(gdb) info breakpoints
# 或者
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000555555556b77 in generator(int) at **.cpp:59
        breakpoint already hit 1 time
2       breakpoint     keep y   0x0000555555557668 in scheduler() at **:183
        breakpoint already hit 1 time
3       breakpoint     keep y   0x00005555555575f9 in check_this_queue_empty(int) at **:179
  1. 删除断点:
bash
(gdb) delete 3 # 后面的数字是i b 中的Num
# 或者
(gdb) d 3
  1. 多线程调试
bash
# 查看线程信息
(gdb) info threads
# 或者
(gdb) i th
  Id   Target Id                              Frame 
  1    Thread 0x7ffff7a02740 (LWP 6016) "new" 0x00007ffff7b88d71 in __futex_abstimed_wait_common64 (private=128, cancel=true, abstime=0x0, op=265, expected=6021, 
    futex_word=0x7ffff7200990) at ./nptl/futex-internal.c:57
* 3    Thread 0x7ffff72006c0 (LWP 6021) "new" scheduler () at **:243 # 当前线程有一个星号标记
bash
# 切换到指定线程
(gdb) thread 1

执行

bash
# 继续执行直到下一个断点
(gdb) continue
(gdb) c

# 单步执行 进入到函数体内部,包括调用的外部函数
(gdb) step
(gdb) s

# 单步执行 不进入函数体内部,直接执行到下一行代码
(gdb) next
(gdb) n

查看运行信息

bash
# 查看变量值
(gdb) print var_name
(gdb) p var_name

# 查看堆栈
(gdb) backtrace
(gdb) bt

其他

bash
# 终止程序
(gdb) kill
# 退出 gdb
(gdb) quit