当使用gdb调试多线程程序时,可以执行以下操作:
1. switching between existing thread
2. step debugging
3. etc.
同时,进程及其线程作为操作系统的资源由Linux内核管理和控制。当gdb从另一个线程(比如t2)切换到线程t1时,它如何与内核协调,因为内核可能还想运行t2一段时间。另外,在gdb单步调试一个特定线程(通过发出“si”命令)时,其他线程如何在这段时间内运行(或完全暂停)?
当使用gdb调试多线程程序时,可以执行以下操作:
1. switching between existing thread
2. step debugging
3. etc.
同时,进程及其线程作为操作系统的资源由Linux内核管理和控制。当gdb从另一个线程(比如t2)切换到线程t1时,它如何与内核协调,因为内核可能还想运行t2一段时间。另外,在gdb单步调试一个特定线程(通过发出“si”命令)时,其他线程如何在这段时间内运行(或完全暂停)?
(gdb)
提示时,所有线程都会被停止。在两个已停止的线程之间切换不需要与内核协调,因为内核不会运行不可运行(已停止)的线程。step
或stepi
命令时,所有线程都会被恢复。您可以使用set scheduler-locking on
来控制该行为,这样只有一个线程会被恢复。如果您忘记关闭scheduler-locking
并执行continue
命令,则只有当前线程会被恢复,这可能会使您感到困惑。