2008-09-25 5 views
26

특정 상황에서 C 덤프를 생성하려고합니다. 이것은 프로덕션 환경에서 실행되며 다른 종류의 디버깅 코드를 조정하기 위해 쉽게 중지 및 재시작되지 않는 프로그램입니다. 또한 프로덕션 환경에 있기 때문에 abort()를 호출하고 싶지 않습니다. 조사중인 문제는 비 프로덕션 환경에서 쉽게 복제되지 않습니다. 필자가 원하는 것은 특정 문제를 발견했을 때 프로그램 자체가 코어 덤프를 생성하는 것입니다. 파일의 이름을 바꿀 정보가 충분하면 계속 진행하는 것이 좋습니다.어떻게 C 프로그램이 종료하지 않고 자체 코어 덤프를 생성 할 수 있습니까?

답변

53
void create_dump(void) 
{ 
    if(!fork()) { 
     // Crash the app in your favorite way here 
     abort() || (*((void*)0) = 42); 
    } 
} 

포크는 프로세스는 아이를 충돌 - 당신이 또 다른 방법은 Google Coredumper 라이브러리를 사용할 수 있습니다

+0

우물쭈물하다. 나는 언제나 (6)을 올리고 프로세스를 다시 시작해야했다. – paxdiablo

+1

이것은 부모를 죽입니다. 자식은 fork()에서 0을 반환합니다. –

+0

segfault 신호를 한 번 처리 할 때이 방법을 사용하여 코어 덤프를 생성 할 수 있지만 종료하지 않으려면 어떻게해야합니까? 전체 화면 프로그램을 작성하고 싶습니다. 가능한 경우 내 프로그램을 종료하지 않고 가능한 오류를 처리하는 방법에 대한 내 옵션에 여전히 가중치를두고 있습니다. –

1

코어 덤프를 생성하는 소스 코드는 gdb 패키지의 일부인 'gcore'에 있습니다.

또한 태양은 gcore입니다.

또한 현재 프로세스를 일시 중단해야하므로 코어 덤프를 실행하는 별도의 프로세스가 있어야합니다. gcore 소스에서 세부 정보를 찾거나 프로세스를 대상으로 플랫폼의 gcore를 실행할 수 있습니다.

3

Sun은 Solaris, HP-UX, Redhat 및 Windows에서 코어 파일을 얻는 방법을 설명합니다. here.

Solaris에는 gcore 프로그램이 있습니다. HP-UX에있을 수 있습니다. 그렇지 않으면 gdb와 gcore 명령을 사용하십시오. Windows에는 win-dbg-root \ tlist.exe 및 win-dbg-root \ adplus.vbs가 있습니다.

3

코어가 필요하거나 스택 트레이스를 원하십니까? 스택 트레이스를 원할 경우 opensource here을 살펴보고 거기에서 코드를 통합하거나 커맨드 라인에서 호출하는 것으로 충분할 수 있습니다.

gdb 프로젝트의 일부 코드가 유용 할 수도 있습니다.

gdb를 사용하여 실행중인 프로세스에 연결하는 것이 좋습니다.

$ gdb /path/to/exec 1234 # 1234 is the pid of the running process 
+0

참고 : 응용 프로그램 자체에서 gdb를 실행에 대한 질문 : http://stackoverflow.com/questions/3151779/how-its-better-to-invoke-gdb-from- print-its-stacktrace –

4

을 할 때마다 당신에게 스냅 샷을 줄 것이다. 이렇게하면 fork + abort 기술과 비슷한 결과가 만들어 지지만 멀티 스레드 응용 프로그램에서 더 나은 결과를 얻습니다 (모든 스레드가 분기되기 전에 일시 중단되므로 자식이 엉망이되지 않습니다).

예 :

 
    #include <google/coredumper.h> 
    ... 
    WriteCoreDump('core.myprogram'); 
    /* Keep going, we generated a core file, 
    * but we didn't crash. 
    */