在gdb中设置应用程序关联

时间:2012-11-26 11:01:17

标签: linux gdb affinity gdbserver

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我遇到了类似的问题,并为自己找到了解决方案,实际上是从您的问题中汲取了灵感。您可能会怀疑,gdbserver在同一内核上运行时可能会冻结,因为您的应用程序线程之一正在使用所有内核的周期,而gdbserver的优先级太低则不允许其运行。

对于我的特殊需求,我将gdb用于在本地计算机上运行实时调度的应用程序,而且我不介意gdb是否在同一内核上运行,但是我希望能够对所有程序进行调试尊重应用程序线程的优先级。对我来说,使事情起作用的原因是将gdb命令扩展为这种更复杂的结构:

FixedUpdate

添加到任务集命令中的chrt命令将切换到SCHED_RR策略,并以指定的优先级运行gdb。我正在调试的线程的运行优先级较低,因此我假设它们仅在gdb未运行时运行。

我以前有问题。我认为,当我请求gdb在某个断点左右暂停执行后gdb恢复执行时,一个线程将在恢复更高优先级的线程之前开始运行,因此,并非总是我期望运行该线程的那个线程实际上正在运行。对我来说,以上命令似乎可以解决所有问题-我认为是因为应用程序线程只能在gdb完成恢复程序所需的所有操作后才能运行。因此,我想如果您想尝试此操作,则适用于您的情况的命令行为:

taskset -c 3 chrt 99 gdb

注意:因此,这会将gdbserver锁定到某个核心,但是您的实时线程可能(或可能)以较低的优先级运行,因此gdbserver不会冻结您。