Можно ли остановить процесс с помощью зонда системной записи, чтобы можно было подключить GDB?

У нас есть многопроцессное приложение, в котором отладка определенного дочернего процесса оказывается сложной. Из-за тайм-аута обмена сообщениями между процессами у нас нет времени, чтобы присоединить gdb к целевому дочернему элементу, поэтому мне было интересно, могу ли я остановить процесс с помощью зонда системной записи?

Я думаю, что необходим простой зонд, например:

probe process("exeName").mark("STOP_HERE")
{
force_sig(SIGSTOP, current);
}

К сожалению, вышесказанное не компилируется … есть идеи?


Я не эксперт по системной ленте, так что это, вероятно, не лучшее решение, но вот мое грубое решение для всех, кто интересуется:

#!/bin/stap -g

global gdbRunning = 0;

probe process(@1).mark(@2)
{
raise(%{ SIGSTOP %});

gdbCmd = sprintf("cgdb -- -q -ex 'thread find %d' %s %d", tid(), @1, pid());

if (gdbRunning == 0)
{
gdbRunning = 1;
printf("STOP PID %d TID %d [%s]\n", pid(), tid(), gdbCmd);
system(gdbCmd);
}
else
{
printf("STOP PID %d TID %d\n", pid(), tid());
}
}

5

Решение

См. Man function :: Повышение (3stap), новое с Systemtap 2.3 (2013-07-25).

stap -g -e 'probe WHATEVER { raise(%{ SIGSTOP %}) }'

Вам нужен режим гуру, чтобы позволить вашему сценарию использовать эту функцию.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]