我有一个使用两个线程的程序。我已经在两个线程中都设置了断点。在gdb下运行程序时,我想在线程之间切换并使它们运行。 (线程t1处于活动状态且正在运行,线程t2;在断点处暂停时。我想停止T1运行并运行T2)。
有什么方法可以在gdb中安排线程吗?
答案 0 :(得分:35)
默认情况下,GDB会在遇到任何断点时停止所有线程,并在发出任何命令时恢复所有线程(例如continue
,next
,{{1 }},step
等)要求下级进程(正在调试的进程)开始执行。
但是,您可以告诉GDB不要这样做:
finish
所以你要设置断点,然后{1}},然后在线程1中设置(gdb) help set scheduler-locking
Set mode for locking scheduler during execution.
off == no locking (threads may preempt at any time)
on == full locking (no thread except the current thread may run)
step == scheduler locked during every single-step operation.
In this mode, no other thread may run during a step command.
Other threads may run while stepping over a function call ('next').
或set scheduler-locking on
(线程2仍然停止),然后按Ctrl-C重新获得控制权GDB,切换到线程2,continue
(线程1仍然停止),等等。
注意:通过设置finish
,很容易导致劣质过程自我死锁。
答案 1 :(得分:4)
如果您使用的是GDB 7或更高版本,请尝试“不间断模式”。
http://sourceware.org/gdb/current/onlinedocs/gdb/Non_002dStop-Mode.html
前面提到的“scheduler-locking on”命令允许您在其他线程停止的情况下执行一个线程。不间断模式允许您步进一个线程,其他线程处于活动状态。
答案 2 :(得分:1)
使用休息条件
(gdb) break frik.c:13 thread 28 if bartab > lim
编辑:
(gdb) break <thread_function_entry_point> thread 2
(gdb) break <thread_function_entry_point> thread 1
(gdb) thread 1
(gdb) continue
(gdb) ... thread 1 finishes
(gdb) thread 2
(gdb) continue
您可以将这些命令放在.gdbrc文件中。