[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에 능숙한 사람이라면 코드를 좀더 잘 해석 할수 있을 것이다.
'프로그래밍 > 리눅스 프로그래밍' 카테고리의 다른 글
[GDB] 자주 까먹는 GDB 명령어 (0) | 2018.10.04 |
---|---|
[프로세스간 통신] IPC(inter process communication) 종류 (8) | 2018.09.10 |
[Makefile] Linux Makefile이란?? (2) | 2018.08.27 |
[Segfault] 기초 편 : Linux의 Segmentation Fault(Segfault) 분석 방법 (0) | 2018.08.26 |
[libcurl] libcurl + openssl + multi thread 처리에 대한 고민 (2) | 2018.04.30 |