리눅스에서 서버를 돌릴 경우 크래시 덤프를 뜨기가 힘들다.

이번에는 윈도우와 리눅스 둘 다 사용이 가능한 breakpad로 리눅스 덤프를 뜨는 방법을 알아보고자 한다.

 

리눅스는 ubuntu를 사용한다.

 


1. 필요한 라이브러리 인스톨

breakpad에서 필요한 라이브러리들을 미리 인스톨한다.

 

①GIT

 

 

② DEPOT TOOLS

break pad를 사용하기 위해 선행적으로 받아야한다.

 

사이트는 아래와 같다.

https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up

 

 

1) git을 이용해 depot_tools를 받아온다

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

 

 

2) PATH 설정을 한다.

export PATH=/path/to/depot_tools:$PATH

여기에서 ['path/to']는 나의 PATH를 입력한다.

 

 

 

③ make / g++

 

sudo apt install make
sudo apt install g++

 

c++ 빌드 환경을 만들기위해 make와 g++을 설치해준다.

 

 

④ zlib1g-dev

 

sudo apt install zlib1g-dev

 

zlib1g dev버전으로 설치해준다.

 

 


2. BREAK PAD 설치

break pad의 홈페이지는 아래와 같다.

https://chromium.googlesource.com/breakpad/breakpad/

 

breakpad/breakpad - Git at Google

Breakpad Breakpad is a set of client and server components which implement a crash-reporting system. Getting started (from main) First, download depot_tools and ensure that they’re in your PATH.Create a new directory for checking out the source code (it

chromium.googlesource.com

 

 

 

git clone https://chromium.googlesource.com/breakpad/breakpad

 

git으로 breakpad를 clone해온다.

 

 

 

 

[

[Myproject]에 breakpad 폴더를 만든 후 fetch 해준다.

 

-. 폴더 만들기

mkdir breakpad
cd breakpad

 

-. fetch

fetch breakpad

 

 

 

 

fetch가 완료되었으면

src폴더로 이동해,

configure과 make를 이용해 breakpad를 빌드해준다

 

cd src
./configure
make

 

 


 

3. BREAK PAD사용

 

 

내부에서 null에러를 일으키는 임시 코드를 작성했다.

 

 

① exception handler import

 

② dump callback 작성

홈페이지에 있는 예시 그대로 작성하였다.

 

 

#include <iostream>
#include <thread>
#include "client/linux/handler/exception_handler.h"

static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor,
void* context, bool succeeded) {
  printf("Dump path: %s\n", descriptor.path());
  return succeeded;
}


void ThreadFunction(int* ptr)
{
        std::cout<<*ptr<<std::endl;
}

int main()
{
          google_breakpad::MinidumpDescriptor descriptor("/tmp");
          google_breakpad::ExceptionHandler eh(descriptor, NULL, dumpCallback, NULL, true, -1);
        //null PTR을 cout : nullptr에러를 일으킨다
        int* ptr = nullptr;
        std::thread threadTest(ThreadFunction, ptr);

        //쓰레드 종료시까지 대기
        threadTest.join();
        return 0;
}

 

③빌드

g++ -I/home/ubuntu/MyProject/breakpad/src/src BreakPadTest.cpp -o test.out -lbreakpad_client

 


 

4. 덤프 확인

 

크래시가 나면 덤프는 PATH설정한 곳으로 나오게 된다.

예시의 경우 /tmp에 덤프가 생성된다.

 

① 덤프 심볼릭 만들기

 

breakpad/src/src/tools/linux/dump_syms/dump_syms ./test.out > test.out.sym

 

덤프 심볼릭을 만든다.

이때 심볼릭은 빌드파일과 같은 이름으로 해야한다.

 

 

② 심볼릭 고유 코드 확인

 

head -n1 test.out.sym

head -n1을 이용하여 심볼릭이 어디를 나타내는지 확인한다

 

③ 심볼릭의 헤더와 같은 위치로 폴더 만들기

 

심볼릭의 헤더가 가리키는 위치에 폴더를 만든다.

그렇게 하지않으면 덤프에서 심볼릭을 찾을 수 없다.

mkdir -p ./symbols/test.out/C742B6BB5BEBFBC5F73889A0908E34610
mv test.out.sym ./symbols/test.out/C742B6BB5BEBFBC5F73889A0908E34610/

 

④ 크래시가 난 위치 확인

 

마지막으로,

breakpad/src/src/processor/minidump_stackwalk 68d64630-fceb-4e30-ba3ee3bc-e3aacc30.dmp ./symbols

 

를 이용하면 아래와 같은 결과가 나온다.

 

0 test.out의 ThreadFunction의 14번째 줄에서 크래시가 난 것을 알 수 있다.

 

 

 

정확히 크래시가 난 곳의 위치 확인이 가능하다.

 

 


윈도우에서는 visual studio에 덤프를 넣기만 해도 디버깅이 가능한 것으로 알고있다.

리눅스에서 뽑은 덤프도 visual studio에서 가능한지는 확인해볼 필요가 있어보인다.

+ Recent posts