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

3

当使用gdb调试多线程程序时,可以执行以下操作:

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

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

1个回答

2
当GDB从一个线程(比如t2)切换到另一个线程(比如t1)时,它如何与内核协调,因为内核可能仍然想要运行t2一段时间。默认情况下,GDB在全停模式下操作。这意味着每当您看到(gdb)提示时,所有线程都会被停止。在两个已停止的线程之间切换不需要与内核协调,因为内核不会运行不可运行(已停止)的线程。
非停止模式中,除当前线程外,其他线程自由运行,内核可以并将调度它们按照其认为合适的方式运行。
当GDB在一个特定的线程上进行单步调试(通过执行"si"命令)时,其他线程如何运行(或完全暂停)在此期间?
默认情况下,当您执行stepstepi命令时,所有线程都会被恢复。您可以使用set scheduler-locking on来控制该行为,这样只有一个线程会被恢复。如果您忘记关闭scheduler-locking并执行continue命令,则只有当前线程会被恢复,这可能会使您感到困惑。

文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接