gdb多线程调试如何与Linux线程调度协调?

时间:2018-04-27 04:19:51

标签: linux multithreading gdb

使用gdb调试多线程程序时可以执行

1. switching between existing thread
2. step debugging 
3. etc.

同时,进程及其作为操作系统资源的线程由Linux内核管理并受其控制。当gdb从另一个(t2)切换到一个线程(比如t1)时,它如何与内核协调,因为内核可能仍然希望在一段时间内运行t2。此外,当gdb步骤在一个特定线程中调试时(通过发出" si"命令),在此期间其他线程如何运行(或完全暂停)?

1 个答案:

答案 0 :(得分:2)

  

当gdb从另一个(t2)切换到一个线程(比如t1)时,它如何与内核协调,因为内核可能仍然希望在一段时间内运行t2。

默认情况下,GDB以全停模式运行。这意味着每当您看到(gdb)提示时,所有线程都已停止。在2个停止的线程之间切换并不需要与内核进行任何协调,因为内核不会运行不可运行(已停止)的线程。

non-stop mode中,除当前之外的线程可以自由运行,并且内核可以并且将安排它们按照它认为合适的方式运行。

  

当gdb步骤在一个特定线程中调试时(通过发出" si"命令),在此期间其他线程如何运行(或完全暂停)?

当您stepstepi时,默认情况下会恢复所有线程。您可以使用set scheduler-locking on来控制它,在这种情况下,只会恢复单个线程。如果您忘记关闭调度程序关闭并执行continue,则只会恢复当前线程,这可能会让您感到困惑。

Documentation