3

有没有一种简单的方法来设置我正在调试的应用程序的亲和力而不将 gdb 锁定到同一个核心?我问的原因是应用程序以实时优先级运行,它需要在单核上运行。目前我使用这个命令行

taskset -c 3 gdbserver :1234 ./app.out

但是应用程序停止响应并冻结 gdb 服务器,从而无法进行调试。我怀疑应用程序的实时优先级阻止 gdb 执行。如果我启动应用程序,然后在没有关联设置的情况下启动 gdb,那么我可以在不冻结 gdb 的情况下附加和调试应用程序。

有没有一种简单的方法来启动 gdb 和具有不同亲和力的应用程序?或者最好:是否有一个 gdb 命令来设置子进程的亲和力?

4

2 回答 2

1

我找到了解决方案:使用 --wrapper 参数。

http://sourceware.org/gdb/onlinedocs/gdb/Server.html

gdbserver --wrapper taskset -c 3 -- :1234 ./app.out
于 2012-11-27T07:53:18.287 回答
1

我遇到了类似的问题,并为自己找到了解决方案,实际上是从您的问题中汲取灵感。正如您所怀疑的,您的 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 不会冻结您。

于 2019-11-20T20:45:08.813 回答