2013-12-10 3 views
5

У нас есть многопроцессорное приложение, где отладка конкретного дочернего процесса оказывается сложной. Из-за тайм-аутов обмена сообщениями между процессами у нас нет времени на подключение 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()); 
    } 
} 
+0

Я порекомендую вам начать процесс с одного дочернего процесса. Легче начать с одного ребенка вместо создания нескольких, а затем написать обработчик, чтобы остановить их. –

+0

Rachit Jain; спасибо за предложение, но это не вариант, к сожалению, это сделало бы намного проще. Еще одна альтернатива, которую я могу опробовать, - это lldb, который запускается и может подключаться намного быстрее, чем gdb (но я придерживаюсь ответа fche на mo). – mrtimdog

ответ

5

См функция человека :: рейз (3stap) , новый как от systemtap 2.3 (2013-07-25).

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

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

+0

Отлично, большое спасибо - это именно то, что я был после :) Я был sillilly пытаюсь установить состояния задачи на поток через set_task_state (...), но, как ни странно, это не сработало, поскольку это не так скажите ядру, что я пытаюсь сделать. Не знаю, почему я не думал об убийстве (...) альтернативах, т. Е. Рейз (...) !! Благодаря! – mrtimdog

+1

Doh! Я бы прочитал прямое повышение в документах! ... "function :: raise - поднять сигнал в текущем потоке" :) – mrtimdog

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