프로그래밍/리눅스 프로그래밍

[Segfault] Core가 없을때 dmesg로 죽은 원일 분석 하기

jinkwon.kim 2018. 8. 29. 01:17
728x90
반응형

[Segfault] Core가 없을때 dmesg로 죽은 원일 분석 하기


1. dmesg 정보로 정보 수집 

  - 코어가 남지 않았을 경우 모든 Core로그는 dmesg에 남는다.

  - 수행 명령어

#dmesg 

  - 추출 가능 정본는 다음과 같다.


 항목

    정보

 값 

 1

  프로그램 명

 segfault_test 이고 pid 는 959 이다.  

 2

  죽은 원인

 segmentfault가 발생하여 죽음 

 3

  죽을 때 참조한 주소

 잘못된 참조 주소 0 

 ( 0은 NULL 값을 참조 했음을 의미 한다)

 4

  죽었을때 실행된 명령어 주소

 죽었을 당시 실행된 명령어 0x400541

 5

  죽었을때 스택 주소

 죽었을 당시의 스택 주소  

 6

  에러 코드

 에러 코드  

 7 

  offset 정보

 Offset 정보 


 

2. dmesg의 정보를 활용하여 어떤 명령어를 수행 하다 죽었는지 확인 하는방법

  1) 실행 파일 전체를 disassemble화 시킨다. 

    - objdump를 사용하며, 이 Tool는 linux에 내장되어있는 tool 이다.

    - objdump 온셥 설명

      D :  Display assembler contents of all sections

 C :  Decode mangled/processed symbol names

 l(소문자 L)  : Include line numbers and filenames in output

    #objdump -DCl ./segfault_test_gdb > coreDump


  2) coreDump 파일 내용 보기 

    - 현재 coreDump 파일에는 disassemble 되어 있는 정보가 존재하기에 우리는 

      IP(Instruction Pointer) 주소를 알기에 해당 주소에 대한 disassemble 코드만 보면된다.

    - grep을 통하여 coeDump 내용을 확인한다. 

    - grep 옵션 설명

      n  : line 정보 표시 

      B  : 일치하는 정보 앞으로 몇 line을 보여줄것인가

      A  : 일치하는 정보 뒤로 몇 line을 보여줄것인가

      "40064a" : 찾을 문자열 

     ./coreDump : 검색 대상 

    #grep -n -B 20 -A 20 "40064a" ./coreDump

    


  3) coreDump 내용 분석 (어떻게 죽었는지 유추를 하기위한 목적)

    1) 죽을 떄 실행된 코드 주소, 즉 IP(Instruction Pointer)는 0x40064a 이다

    2) 코드 정보 : movzbl (%rax), %eax

      - 어딘가에 값을 이동 하다 죽었다고 유추 할수 있다.

      - Assemble에 능숙한 사람이라면 코드를 좀더 잘 해석 할수 있을 것이다.


   

728x90
반응형