리눅스 서버 Apache dump 파일 디버깅 방법

리눅스 서버 Apache dump 파일 디버깅 방법

Info
클라우독 2022년 상/하반기 이전 구 버젼 : 해당 있음.
클라우독 2022년 하반기 이후 신 버젼 :  해당 있음.

개요

리눅스 서버에서 Apache가 크래시 될 경우 덤프 파일을 생성 할 수 있습니다.
본 아티클에서는 Apache 덤프파일 생성 방법과 덤프파일 분석 방법을 설명합니다.

Apache 덤프파일 생성 방법

1.  httpd.conf 수정
   ① vi /usr/local/apache/conf/httpd.conf 로 설정파일을 오픈합니다.
   ② CoreDumpDirectory logs/apache_dump 항목을 추가하고 저장합니다.

2.  apache_dump 폴더 생성
   ①  mkdir /usr/local/apache/logs/apache_dump 명령어로 폴더를 생성합니다.
   ②  chmod 777 /usr/local/apache/logs/apache_dump 명령어로 권한을 변경합니다.

3.  core dump 파일크기 제한 해제
   ①  unlimit -c unlimited  명령어로 core 파일크기 제한을 해제합니다.
 
4.  Apache 서비스를 재시작 합니다. 

Apache 덤프파일 분석 방법

덤프 설정 이후 Apache error.log에서 아래와 같은 형식의 Segmentation fault 에러 로그가 확인되면 덤프 파일 생성됩니다.
아파치 error.log 경로 및 파일 형식: /usr/local/apache/logs/error.log.yyyy_mm_dd

[Wed Mar 22 13:06:18.787227 2023] [core:notice] [pid 17582:tid 140344862984000] AH00051: child pid 17585 exit signal Segmentation fault (11), possible coredump in /usr/local/apache/logs/apache_dump

덤프파일 분석은 문제가 발생한 서버에 직접 연결 후에 확인이 가능합니다. 내부PC로 dump 파일을 가져오더라도 확인은 불가합니다.
분석 절차는 다음과 같습니다.

1.   Coredump 디렉토리(기본경로: /usr/local/apache/logs/apache_dump)로 설정한 경로로 이동합니다.

cd /usr/local/apache/logs/apache_dump

2.   gdb 명령어를 통해 coredump 파일을 open합니다.

gdb /usr/local/apache/bin/httpd [coredump 파일명]
 
ex) coredump 파일명이 core.10192 일 경우
gdb /usr/local/apache/bin/httpd core.10192

3.   backtrace 명령어를 입력하여 로그를 확인합니다.

(gdb) bt
#0  0x000000000001cbd6 in ?? ()
#1  0x00007f4290234164 in plusdrive_DecryptFile_handler (pPDServerRequest=0x7f4288039030) at protocol/decryptfile.x:146
#2  0x0000000000000000 in ?? ()

위 back trace 로그 중 분석 가능한 프레임과 불가능한 프레임은 다음과 같습니다.
  1. 분석 가능한 프레임: 1 (함수명: plusdrive_DecryptFile_handler, 코드 위치: protocol/decryptfile.x:146 가 명시되어 있어서 확인 가능)
  2. 분석 불가능한 프레임: 0, 2 (함수 및 코드의 위치 정보가 없어서 확인 불가)
4.   문제가 발생한 frame으로 진입합니다.

(gdb) f [프레임 번호]
 
ex) 프레임 번호가 1인 경우
(gdb) f 1

5.   list 명령어를 통해 문제가 발생한 코드 위치를 확인합니다.

(gdb) list

명령어를 입력해도 코드 위치가 나오지 않을 수 있습니다.

6.   3~5에서 확인한 로그 및 해당 서버의 엔진 버전을 웹개발팀에 전달하여 분석을 요청합니다. (필요에 따라 개발팀에서 원격 지원을 통해 확인이 필요할 수 있습니다.)

7.   확인이 완료되면 [q]를 입력하여 디버깅을 중단합니다.

(gdb) q