2012-04-18 6 views
18

데몬 프로파일 링에 gprof를 사용하고 싶습니다. 내 데몬은 일부 콜백을 등록하는 타사 라이브러리를 사용하고 결코 반환하지 않는 main 함수를 호출합니다. 데몬을 종료하려면 kill (SIGTERM 또는 SIGKILL)으로 전화해야합니다.프로세스를 죽이기 전에 gmon.out 저장하기

프로파일 형 프로그램 (2) 또는의 gmon.out 파일에 저장되는 프로파일 정보는 일반적으로 반환, "exit"를 호출해야합니다 : 불행하게도, gprof은 설명서 페이지는이 다음 말했다.

SIGTERM 또는 SIGKILL로 종료 된 프로세스에 대한 프로파일 링 정보를 저장하는 방법이 있습니까?

답변

24

먼저, @wallyk에게 좋은 초기 포인터를 제공해 주신 것에 감사드립니다. 나는 다음과 같이 나의 문제점을 해결했다. libc의 gprof 종료 핸들러는 _mcleanup입니다. 그래서 SIGUSR1 (제 3 자 라이브러리에서 사용하지 않음)에 대한 신호 처리기를 등록하고 _mcleanup_exit을 호출했습니다. 완벽하게 작동합니다! 코드는 다음과 같습니다 :

#include <dlfcn.h> 
#include <stdio.h> 
#include <unistd.h> 

void sigUsr1Handler(int sig) 
{ 
    fprintf(stderr, "Exiting on SIGUSR1\n"); 
    void (*_mcleanup)(void); 
    _mcleanup = (void (*)(void))dlsym(RTLD_DEFAULT, "_mcleanup"); 
    if (_mcleanup == NULL) 
     fprintf(stderr, "Unable to find gprof exit hook\n"); 
    else _mcleanup(); 
    _exit(0); 
} 

int main(int argc, char* argv[]) 
{ 
    signal(SIGUSR1, sigUsr1Handler); 
    neverReturningLibraryFunction(); 
} 
+1

또한 컴파일러와 링커에 플래그를 추가해야합니다. g ++의 경우 다음을 사용해야합니다. -Wl, - no-as-needed -ldl -pg. 출처 : http://stackoverflow.com/questions/20369672/undefined-reference-to-dlsym – rkioji

6

타사 라이브러리가 catch하거나 무시하지 않는 신호에 신호 처리기를 추가 할 수 있습니다. 아마 SIGUSR1은 충분하지만 충분히 익숙하다면 도서관의 문서 —을 실험하거나 읽어야 할 것입니다.

신호 처리기는 간단히 exit()을 호출 할 수 있습니다.

+0

멋진 답변이지만 내 문제는 해결되지 않습니다. 타사 라이브러리는 omnithread를 사용하고 실행 중에 뮤텍스를 보유합니다. omnithread는 atexit을 사용하여 무언가를 등록하는 것처럼 보입니다. 왜냐하면 나는 'omni_thread_fatal'의 인스턴스를 던진 후에 종료됩니다. 프로세스 코어는 gmon.out없이 덤프합니다. gprof의 atexit() 훅을 직접 호출 할 수는 없습니까? – user1202136

관련 문제