2015-05-06 5 views
2

Возможно ли (в программе на C или C++, работающей под управлением Linux на архитектуре с 64-разрядной архитектурой) для потока A, чтобы прочитать значение регистра счетчика программ потока B, не требуя каких-либо специальных инструментов для кодирования кода B?Можно ли читать счетчик программ другой нити?

(Я понимаю, что это странная вещь, которую нужно делать, желание появляется только потому, что мне любопытно, может ли поток A использовать это, чтобы обнаружить, что поток B застрял в неудавшемся системном вызове, как описано here)

ответ

3

В Linux, поле 30 из /proc/self/task/%d/stat, где %d необходимо заполнить ядром, указанным в этом потоке, содержит последнее значение указателя инструкции для потока. См. http://man7.org/linux/man-pages/man5/proc.5.html и обратите внимание, что это задокументировано в соответствии с /proc/[pid]/stat, но версия в каталоге task в текущем процессе - это тот, который вы хотите настроить для потока.

Жесткая часть может получать ядро ​​для потока. Самый простой способ сделать это - вызывать syscall(SYS_gettid) из потока и хранить где-нибудь его содержимое.

+0

Для данного процесса проверка всех TID, перечисленных в каталоге задач, будет достаточной, если цель состоит в том, чтобы найти ** любую ** застрявшую нить - «TID X кажется застрявшим в значении ПК Y». Значение TID действительно не имеет значения. Но это не позволит избежать ложных срабатываний, если значение ПК для «нормального» места для блокировки этого потока. –

+0

Да. У ОП может быть проблема XY, которая происходит здесь, поскольку желаемый механизм на самом деле не является хорошим подходом к проблеме. Но я все же думал, что стоит ответить, потому что есть решение для запрошенного механизма. –

+0

R .. согласился с тем, что у меня, вероятно, есть проблема с XY ... мне бы очень хотелось, чтобы ядро ​​«oops» полностью разрушило мой процесс, вместо того, чтобы заставить мой другой поток прыгать через обручи, чтобы определить, нить была парализована навсегда, и если это должно привести к сбою самого процесса, чтобы перезапустить процесс. Но маловероятно, что существует средство для контроля этого поведения. :( –

Смежные вопросы