[1. 개요]
프로그램이 비정상 종료하게 되어 dmesg 를 체크 한 경우,
비정상 종료한 프로그램에서 crash 난 위치를 대강 파악할 수 있다.
보통 그 크래시 로그는 아래와 같은 형태이다.
- segfault at 1d ip 00000...508b30 sp 00007f93474f19838 error 4 in MyApp[400000+33f000]
# at 다음에는 주소 값 (0 인 경우는 NULL 포인터를 접근 한 경우라 볼 수 있다.)
# ip 는 instruction pointer 로 실제 진행 한 명령어의 주소 값 (이 명령어, 코드가 충돌 지점이다)
# error 는 오류 코드
# sp 는 stack pointer 로 아직 써본 경우는 없음.
# MyApp ~ 는 base_address + offset 으로 구성
-> MyApp 바이너리가 0x400000 베이스 주소에서 로드되고, 그 offset 은 33f000 바이트 지점.
-> 실제 주소는 0x400000 + 0x33f000 을 접근하려다가 크래시 발생
-> 0x400000 ~ (0x400000 + 0x33f000)
-> ip 가 위 범위를 벗어난다면, 다른 라이브러리에서 발생 한 문제일 수 있다.
-> 다른 라이브러이의 base_address 를 확인 할 필요 있다.
offset = ip - base
= 0x508b30 - 0x400000
= 0x108b30
$ addr2line -e MyApp 0x108b30 -f -C
$ addr2line -e MyApp.debug 0x508b30 -f -C
'서버 관리 > 리눅스' 카테고리의 다른 글
service 파일 (0) | 2025.09.02 |
---|---|
update-alternatives (0) | 2025.08.30 |
ulimit (0) | 2025.07.03 |
리눅스 패키지 관리 (0) | 2025.05.01 |
samba 서버 설치 (0) | 2025.05.01 |