我遇到了类似的问题,并为自己找到了解决方案,实际上是从您的问题中汲取灵感。正如您所怀疑的,您的 gdbserver 在同一个内核上运行时可能会冻结,因为您的一个应用程序线程正在使用所有内核的周期,并且 gdbserver 不允许运行,因为它的优先级太低。
对于我的特殊需求,我将 gdb 用于在本地计算机上运行的采用实时调度的应用程序,我不介意 gdb 是否在同一个内核上运行,但我希望能够以所有优先级调试我的程序尊重的应用程序线程。对我来说,让事情起作用的是将 gdb 命令扩展到这个更复杂的结构:
taskset -c 3 chrt 99 gdb
添加到任务集命令的 chrt 命令切换到 SCHED_RR 策略并以指定的优先级运行 gdb。我正在调试的线程以较低的优先级自行运行,因此我假设它们仅在 gdb 未运行时运行。
我之前有问题。我认为,当我在 gdb 在断点处暂停执行之后请求 gdb 恢复执行时,一个线程将在恢复更高优先级的线程之前开始运行,因此它并不总是我期望运行的线程实际上正在运行。对我来说,上面的命令似乎可以解决所有问题——我假设是因为应用程序线程只能在 gdb 完成恢复程序所需做的所有事情后才能运行。因此,如果您想尝试一下,我猜想适用于您的情况的命令行是:
taskset -c 3 chrt 99 gdbserver :1234 ./app.out
注意:所以这会将 gdbserver 锁定到某个核心,但您的实时线程可能(或可能)以较低的优先级运行,因此 gdbserver 不会冻结您。