gdb:multithreading

我有一个使用两个线程的程序。 我已经把这个断点放在了两个线程中。 在gdb下运行程序时,我想在线程之间切换并使其运行。 (线程t1处于活动状态并正在运行,线程t2;在断点处暂停时,我想停止T1运行并运行T2)。

有什么办法可以在gdb中安排线程吗?

谢谢Arpit

Solutions Collecting From Web of "gdb:multithreading"

默认情况下,当任何断点被命中时,GDB停止所有的线程,当你发出任何命令(例如continuenextstepfinish等)时,GDB会重启所有的线程,执行。

但是,你可以告诉GDB不要这样做:

 (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 ,然后continuefinish在线程1(线程2仍然停止),然后Ctrl-C重新控制GDB,切换到线程2, continue (线程1仍然停止)等等

当心:通过设置scheduler-locking on它很容易导致低级进程自我死锁。

如果您使用的是GDB 7或更高版本,请尝试“非停止模式”。

http://sourceware.org/gdb/current/onlinedocs/gdb/Non_002dStop-Mode.html

前面提到的“调度程序锁定”命令允许您在其他人停止的情况下执行一个线程。 非停止模式允许您在其他人处于活动状态时执行一个线程。

使用休息条件

 (gdb) break frik.c:13 thread 28 if bartab > lim 

请参阅使用GDB进行调试

编辑:

 (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文件中。