BreakPad (C++)


크래시는 사용자의 환경때문에 발생할 수도 있고 개발자의 실수에 의해 발생할 수 있다. 어떤 이유에서든 예상하지 못한 상황에서의 프로그램 종료는 사용자를 당혹스럽게 한다.

이런 상황이 발생하지 않도록 만드는 것이 중요하지만 이런 크래시가 발생하지 않으리라는 보장은 어느 누구도 할 수 없다. 왜냐하면 사람이 소프트웨어를 만들기 때문이다. 완벽한 누군가가 소프트웨어를 만든다면 상관 없는 얘기다. 그런데 "완벽한 사람"이 있을까?

그렇다면 이 위험 요소를 어떻게 관리해야 할까? 정답은 사용자로부터 빠른 피드백을 받는 것이다. 다행히 우리는 사용자의 실행환경이 담겨있는 미니덤프를 얻을 수 있다.

이제 고민은 이 미니덤프를 어떻게 만들 것이며 어떻게 우리 손에 넣을 것인가 하는 것이다. 일반 사용자는 미니덤프가 무엇인지 알지 못한다. 그렇기 때문에 사용자에게 이것에 대해 이해하고, 저장하고 개발자에게 직접 주도록 해서는 안된다. 사용자는 문제가 발생했고 지금의 상태를 만든 사람에게 제공해야만 이 문제를 빨리 해결할 수 있다는 것만 알면 된다.

여력이 된다면 사용자의 간단한 주석을 첨부하도록 해서 더 좋은 피드백을 얻을 수 있다. 이처럼 사용자에게 "원클릭" 과 간단한 주석 이상의 것을 바라선 안된다.

간단한 미니덤프 장치를 만드는 것은 그리 어려운 일이 아니다. 하지만 보다 좋은 피드백을 얻기 위해 기능을 추가하려면 많은 노력이 필요하다. 그럴 때 필요한 것은 이미 잘 만들어진 라이브러리를 가져다가 쓰려는 마음? 물론 조사하는 노력이 필요하지만 해보니 어렵지 않게 쓸만한 라이브러리를 찾을 수 있었다.

특징


out-of-process


breakpad 의 가장 큰 특징은 out-of-process 를 지원하는 것이다. 크래시를 처리하는 함수에서 앞에서 말한 다양한 기능을 추가한다면 제대로 동작하지 않을 수도 있다. 간단한 예로, 사용자에게 의견을 받는 윈도우를 띄운다고 할 때 메인 스레드의 메시지 루프가 깨지면 윈도우 자체를 볼 수 없게 된다.

크래시가 발생한 프로세스 밖(out-of-process)에서 처리하면 이와 같은 문제를 줄일 수 있다. 그래서 크래시 발생을 처리하기 위해 보다 많은 것을 제공할 수 있다. 물론 in-process 도 지원하기 때문에 필요에 맞게 골라 쓰면 된다.

크로스 플랫폼


멀티플랫폼 지원을 고려한다면 breakpad 는 좋은 선택이 될 수 있다. breakpad 를 사용한다면 크로스 플랫폼에 대한 고민을 줄여줄 수 있다.

검증된 도구


또 한 가지 좋은 점은 믿을만 하다는 것이다. breakpad 를 사용하는 프로그램들을 보면 믿음이 간다. breakpad 를 사용하는 프로그램은 크롬브라우저, 파이어폭스, 피카사, 구글 어스 등이 있다.

준비


소스 가져오기


svn 으로 소스를 가져올 수 있다.

http://code.google.com/p/google-breakpad/source/checkout

빌드하기


breakpad 는 오픈 소스인 gyp 를 이용해 빌드한다. breakpad 소스에 포함돼 있으므로 gyp 를 따로 받을 필요가 없지만 gyp 도구가 파이썬 스크립트이므로 python 이 설치돼 있어야 한다. 설추 후에 python 경로가 path 환경변수에 없다면 추가해 줘야 한다.

src\client\windows 폴더에서 ..\..\tools\gyp\gyp.bat breakpad_client.gyp 를 실행하면 솔루션 파일과 프로젝트 파일이 생성되는 것을 볼 수 있다. 만들어진 솔루션 파일을 열어 그 안에 있는 build_all 프로젝트를 빌드하면 된다.

테스트 당시에는 유닛테스트 빌드가 깨졌다. 그렇지만 라이브러리와 테스트 프로그램은 빌드가 되므로 다른 테스트하는데는 지장이 없다.

미니덤프 테스트 해보기


빌드까지 성공했으므로 이제 미니덤프를 만들어보자. 테스트용 프로그램(crash_generation_app 프로젝트)이 솔루션에 포함돼 있으므로 따로 만들 필요는 없다. 이 테스트 프로그램을 이용하면 in-process 뿐만 아니라 out-of-process 미니덤프도 만들어 볼 수 있다. 여기에서는 out-of-process 미니덤프를 만드는 방법을 소개하겠다.

프로그램을 실행하기에 앞서 C:\Dumps 폴더를 만들어야 한다. 이 폴더를 만들지 않으면 미니덤프를 저장하다가 실패한다.

준비가 다 됐다면 프로그램을 실행해 보자. 제대로 된 out-of-process 를 테스트하기 위해서는 프로세스를 두 개 띄워야 한다. 두 번째 프로세스를 띄울 때 서버를 실행할 수 없다는 에러 메시지가 뜨지만 무시해도 좋다. 그런 다음 서버가 실행되지 않는 프로세스에서 Client -> Deref Zero 메뉴를 선택해 강제로 크래시를 발생시키면 C:\Dumps 폴더에 미니덤프 파일이 생성되는 것을 볼 수 있다.

마치며


실무에서 breakpad 를 사용하길 강력히 권한다. 무엇보다 out-of-process 는 굉장히 매력적이다. 외부 프로세스에 확장 기능을 구현해서 더 품질 좋은 소프트웨어를 개발할 수 있도록 도와주기 때문이다.
Posted by Yardbirds 트랙백 0 : 댓글 2

티스토리 툴바