우리는 특정 하위 프로세스의 디버깅이 어렵다는 것을 입증하는 다중 프로세스 응용 프로그램을 보유하고 있습니다. 프로세스 간의 메시징 타임 아웃으로 인해 대상 자식에게 gdb를 첨부 할 시간이 없기 때문에 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이다. lldb는 gdb가 할 수있는 것보다 훨씬 빨리 시작할 수있다. (하지만 나는 fche의 답을 고수하고있다.) – mrtimdog