2013-12-10 4 views
5

우리는 특정 하위 프로세스의 디버깅이 어렵다는 것을 입증하는 다중 프로세스 응용 프로그램을 보유하고 있습니다. 프로세스 간의 메시징 타임 아웃으로 인해 대상 자식에게 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()); 
    } 
} 
+0

단일 하위 프로세스로 프로세스를 시작하는 것이 좋습니다. 하나의 자식으로 시작하는 것이 더 쉽습니다. 다중 자식을 만드는 대신 핸들러를 사용하여 자식을 중지시킵니다. –

+0

Rachit Jain; 제안에 감사드립니다.하지만 불행히도 옵션이 아닙니다. 일이 훨씬 쉬워 졌을 것입니다. 내가 관심을 가지고 시도 할 수있는 또 다른 대안은 lldb이다. lldb는 gdb가 할 수있는 것보다 훨씬 빨리 시작할 수있다. (하지만 나는 fche의 답을 고수하고있다.) – mrtimdog

답변

5

참조 사람 기능 : 인상 (3stap) , 시스템 탭 2.3 (2013-07-25)의 새로운 기능입니다.

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

스크립트에서이 기능을 사용하려면 전문가 모드가 필요합니다.

+0

대단히 고마워요. 대단히 고마워요. 정확히 이것 이후였습니다. set_task_state (...)를 통해 스레드마다 작업 상태를 설정하려고했지만 실지로 이상하지 않았습니다. 내가하려고하는 것을 커널에 알린다. 왜 내가 죽이기 (...) 대안, 즉 레이즈 (...)를 생각하지 않았는지 알 수 없습니다 !! 감사! – mrtimdog

+1

Doh! 나는 문서에서 똑바로 과거의 인상을 읽었어요! ... "function :: raise - 현재 스레드에서 신호를 발생시킵니다." – mrtimdog