리눅스에서 서버를 돌릴 경우 크래시 덤프를 뜨기가 힘들다.
이번에는 윈도우와 리눅스 둘 다 사용이 가능한 breakpad로 리눅스 덤프를 뜨는 방법을 알아보고자 한다.
리눅스는 ubuntu를 사용한다.
1. 필요한 라이브러리 인스톨
breakpad에서 필요한 라이브러리들을 미리 인스톨한다.
①GIT
② DEPOT TOOLS
break pad를 사용하기 위해 선행적으로 받아야한다.
사이트는 아래와 같다.
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에서 가능한지는 확인해볼 필요가 있어보인다.