info b 会显示所有线程的断点,并不是只显示当前线程的。
info threads:显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID。
136 Thread 7886 0x0000003f5220e4ed in ?? ()
135 Thread 22414 0x0000003f5220e054 in ?? () -------------- 第一列为ID。
* 3 Thread 7884 0x0000003f51ae14f3 in ?? ()--------- 星号表示这是“当前调试的线程”。
2 Thread 5261 0x0000003f51aacb8d in ?? ()
1 Thread 22216 0x0000003f51a328a5 in ?? ()
thread ID: 切换当前调试的线程为指定ID的线程。
如命令thread 2,表示切换到线程2。
thread apply all command: 让所有被调试线程执行GDB命令command。
如命令thread apply all b main,表示所有线程都设置断点。
执行info b得到如:
145 breakpoint keep y 0x0000003f51aacb8d
146 breakpoint keep y 0x0000003f51aacb8d
147 breakpoint keep y 0x0000003f51aacb8d
148 breakpoint keep y 0x0000003f51aacb8d
149 breakpoint keep y 0x0000003f51aacb8d
command thread all:在所有线程中相应的行上设置断点
如命令b main thread all。
执行info b得到如:
154 breakpoint keep y <PENDING> main thread all ---------- 为啥和thread apply all command命令执行结果不同?
thread apply ID1 ID2 command: 让一个或者多个线程执行GDB命令command。
set scheduler-locking off|on|step:在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
- off 不锁定任何线程,也就是所有线程都执行,这是默认值。
- on 只有当前被调试程序会执行。
- step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
GDBv7.0引入的non-stop模式,当前线程断住,其他线程可以继续执行。