예전에 제 블로그에 올렸었던 건데, 그냥 복사해서 붙입니다.
혹시 개발하시면서 core file 이름이 전부 그냥 "core" 라서 답답해 하셨던 분이 계시다면 희소식(?) 일 겁니다. 리눅스에만 관련된 건데... 다른 플랫폼은 제가 작업하다가 불편하다고 느끼면 조사해 보겠습니다 ;-)




sun 이나 hp, aix 등에서는 생성된 core file 에다가 file 명령어를 치면 어떤 실행파일에서 생성된 core 인지가 나온다. 그러나 linux 에서는 그렇지 않다. (아쉽게도 OSX 에서도 그렇지 않다)

다음의 프로그램을 만들어서 테스트 해 본 결과

 
#include <stdlib.h>
#include <stdio.h>

int main(void)
{   
    int *a = NULL;

    printf("hello\n");
    fflush(stdout);

    *a = 32;

    return 0;
}


각각의 플랫폼에서는 다음과 같은 결과가 나왔다 :

$ uname -a;file core                                    
SunOS v880 5.8 Generic_117350-51 sun4u sparc SUNW,Sun-Fire-880
core:           ELF 32-bit MSB core file SPARC Version 1, from 'a.out'

$ uname -a; file core
AIX aix5 3 5 0001D01F4C00
core: AIX core file 32-bit, a.out

% uname -a; file core
HP-UX hp1123 B.11.23 U 9000/800 190494686 ??????-????? ???̼???
core:           core ???? - 'a.out' - SIGBUS ????

$ uname -a; file core.528
Darwin castepo.local 9.3.0 Darwin Kernel Version 9.3.0: Fri May 23 00:49:16 PDT 2008; root:xnu-1228.5.18~1/RELEASE_I386 i386
core.528: Mach-O core i386

때때로 여러개의 프로세스를 마구 띄우는 daemon 을 작업하다 보면 뜬 프로세스들 중 하나가 죽을 경우에 생기는 core 파일이 도대체 어느 프로그램이 죽어서 생긴 것인지 알 수 없을 경우가 있다. 물론, 하나씩 디버거로 읽어서 뭔가 좀 말이 되는 콜스택을 보여준다든지 하는 녀석을 대충 지레짐작해서 얘이거니 하고 분석할 수도 있지만, 기분 나쁘다.

리눅스 맨페이지에 따르면 커널 버젼 2.6 이후, 그리고 2.4.21 이후의 커널에 다음의 기능이 추가되어 있다고 한다 :
$ man core | col -b
.
.
.
   Naming of core dump files
       By default, a core dump file is    named  core,  but  the    /proc/sys/ker-
       nel/core_pattern file (since Linux 2.6 and 2.4.21) can be set to define
       a template that is used to name core dump files.  The template can con-
       tain  % specifiers which are substituted by the following values when a
       core file is created:

     %%  A single % character
     %p  PID of dumped process
     %u  real UID of dumped process
     %g  real GID of dumped process
     %s  number of signal causing dump
     %t  time of dump (seconds since 0:00h, 1 Jan 1970)
     %h  hostname (same as 'nodename' returned by uname(2))
     %e  executable filename
말인 즉슨, 다음과 같이 하면 core file 이 생성될 때 그 파일의 이름을 어떻게 지을 것인가 하는 문제를 사용자가 설정할 수 있다는 이야기인데, cut to the chase, 결론부터 말하면, 다음과 같이 하면 실행파일의 이름을 가지고 core 파일의 이름을 만들 수 있다 :

# cat > /proc/sys/kernel/core_pattern
core.%e
^D
#
저와 같이 해 두고 아까 컴파일한 파일을 실행시켜 보면,
$ ./a.out
hello
Segmentation fault (core dumped)
$ ls
a.c  a.out*  core.a.out
$
아아~~ 행복하다. =ㅂ=);;;

Posted by Orchistro

댓글을 달아 주세요

  1. 불광불급 2008.10.13 09:12 신고  수정/삭제 댓글쓰기 댓글주소

    저같은 사람한테는 이런 귀한 정보가 소귀에 경읽기겠지만 아마 개발하시는 분들한테는 많이 유용하리라 확신, 확신, 또 확신...
    Orchistro님, 다른 플랫폼도 조사해서 꼭 여기다 올려주시와요. 복받으실 거예요. ^^
    Orchistro님을 비롯, 알티스토리에 방문하시는 모든 분들... 즐거운 한 주 보내십셔~.

  2. 저를 실망시키지 않는 Orchistro님.. 개발자분들에게 큰 도움이 되는 좋은 정보 올려 주셔서 감사하구요.. 지금보다 조금만 더 자주 포스팅해 주시면 감사하겠습니다..^^ 히히..바쁘신 와중에 포스팅해 주신 고마움도 모르는 저를 용서하시와요...ㅋㅋㅋ 즐건 한 주 보내셔요..

  3. 당신의 구조 웹사이트 전 에서 찾을 감사하겠습니다 .

티스토리 툴바