У нас есть многопроцессорное приложение, где отладка конкретного дочернего процесса оказывается сложной. Из-за тайм-аутов обмена сообщениями между процессами у нас нет времени на подключение gdb к целевому ребенку, поэтому мне было интересно, могу ли я остановить процесс с помощью зонда systemtap?Может ли процесс быть остановлен с помощью зонда systemtap, который может быть подключен gdb?
Простой зонд должен, как мне кажется, необходимо, например .:
probe process("exeName").mark("STOP_HERE")
{
force_sig(SIGSTOP, current);
}
К сожалению, выше не компиляции ... какие-то идеи?
Я не эксперт Systemtap, так что это, вероятно, не самое лучшее решение, но вот мое сырое решение для тех, кто заинтересован:
#!/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());
}
}
Я порекомендую вам начать процесс с одного дочернего процесса. Легче начать с одного ребенка вместо создания нескольких, а затем написать обработчик, чтобы остановить их. –
Rachit Jain; спасибо за предложение, но это не вариант, к сожалению, это сделало бы намного проще. Еще одна альтернатива, которую я могу опробовать, - это lldb, который запускается и может подключаться намного быстрее, чем gdb (но я придерживаюсь ответа fche на mo). – mrtimdog