티스토리 뷰

programming/etc

core dump analysis by gdb

Jacob_baek 2013. 6. 24. 10:57

core dump 생성전

우선 RHEL 7 기준으로 아래와 같은 설정이 이루어져 있어야 core dump가 생성된다.

[root@localhost ~]# sysctl -a | grep -E 'kernel.core|suid_dumpable'

fs.suid_dumpable = 1

kernel.core_pattern = core

kernel.core_pipe_limit = 0

kernel.core_uses_pid = 1

위와 같이 suid_dumpable 이라는 값이 1로 변경되어야 한다.
kernel.core_pattern의 경우 남겨지는 파일의 패턴으로 sysctl에서 설정이 가능하다.


필요시 아래의 덤프를 강제로 생성시켜야할 경우 아래 floating point exception program code를 받아 compile 하여 core dump 파일을 생성한다.

- https://www.tutorialspoint.com/gnu_debugger/gdb_debugging_example1.htm


위 설정에 관련된 부분은 아래 링크를 참조하여 좀더 상세히 확인할 수 있다.

- http://webplay.pro/linux/enable-core-dumps-rhel-7.html


program의 core dump 분석

개발중인 Program에 core dump가 발생되었다면 발생된 core dump file을 통해 실제 코드상에서 segfault와 같은 exception이 발생된 위치를 찾아야 한다. 


이때 필히 맞춰야 하는것은 발생된 core dump 시점에 개발중이었던 코드로 compile 된 binary가 있어야 한다는 것이다. 즉, core dump 발생이 된 binary와 동일한 binary가 있어야 하며 해당 binary에는 symbol table을 포함해야 한다.


심볼 테이블 포함 방법은 다음과 같다.

makefile을 통한 build 과정에서는 -O1 과 같은 옵션을 제거하고 make 수행한다.

참고로 -O flag의 경우 optimize 의 약자로 0부터 3까지 설정할 수 있다.

http://www.rapidtables.com/code/linux/gcc/gcc-o.htm


g++을 통한 compile 과정에서는 -g 옵션을 추가하여 symbol table을 추가한다.

이후 gdb를 이용하여 debugging을 진행한다.


gdb를 이용한 Core dump 파일 분석

argument 추가로 입력받아 수행시킬수 있다.

[root@localhost ~]# gdb program

(gdb) r 1.1.1.1

Starting program: /root/crash 1.1.1.1

...


breaking point 사용하기

(gdb) b 104

(gdb) b testprogram.c:104


변수 데이터 출력하기

(gdb) list

13         return 0;

14      }

15

16      int divint(int a, int b)

17      {

18         return a / b;

19      }

(gdb) p a
$1 = 3


backtrace 혹은 where 를 사용하여 실제 exception이 발생한 위치확인과 추적을 수행한다.

(gdb) bt full

#3  0x0000000000412a72 in choosing_test (abc=0xc4d808, def=0x2ce57bc0, ghi=0x4ae1ddb0,
    jkl=1448010228, mno=0xc9da60, pqr=0x0) at testprg.c:554
    score = 493
    test_score = 500
    test_value = inf

    ptr = (ab_struct *) 0xfaedc0

    check_bool = false
    check_bool2 = false

    ...


참고로 g++ 로 컴파일할때는 -g 옵션을 통해 symbol table 및 debug metadata를 포함시킨다.

심볼 테이블이란?

변수나 함수에 대한 주소매핑 테이블이라 생각할수 있다.

- http://air802.tistory.com/111


참고로 core 파일만으로도 가능은 하다.

다만 line number와 같은 자세한 정보가 출력되지 않기에 symbol table이 존재하는 binary와 함께 사용하는것이 효율적이다.

[root@localhost ~]# gdb -c core.11223


실행되고 있는 process의 이름과 PID를 가지고 attache도 가능하다.

ps -ef command를 통해 pid를 확인한다.

[root@localhost ~]# ps -ef | grep testprg

1223:root 5544 1 0 01:56 ? 00:00:04 /usr/local/bin/testprg

[root@localhost ~]# gdb testprg 5544

이후 위와 같이 pid를 통해 attach 시킨다.


core dump size 설정후에도 dump file이 남지 않을 경우 아래 참고사이트를 다시 필독해보고 조건을 맞추어보아야 한다.

예로 실행파일이 suid나 sgid가 설정되어 있는 경우에도 default로 남겨지지 않도록 한다고 한다.

이와 같은 경우 아래 설정을 추가하고 sysctl 을 재적용하여 core dump 를 생성할 수 있다.

fs.suid_dumpable = 2


몇가지 option을 포함한 kill command를 사용하여 테스트를 할 수 있다.

# kill -11 [pid]

# kill -s SIGSEGV [pid]


위 command실행 실행중인 daemon이 종료되며 core dump가 생성된다.


참고사이트

- http://www.fromdual.com/hunting-the-core

- http://bencane.com/2014/04/01/understanding-the-kill-command-and-how-to-terminate-processes-in-linux/


참고사이트

https://access.redhat.com/solutions/4896

'programming > etc' 카테고리의 다른 글

jq command  (0) 2020.09.23
groovy script  (0) 2020.09.22
language level  (0) 2013.07.05
댓글
댓글쓰기 폼