Breakpad를 사용하여 WPE WebKit으로 크래시 덤프 생성
소개 및 BreakPad 개요
Breakpad은 충돌 보고서를 생성하는 데 도움이 되는 Google의 도구입니다. 발신자 its description:
Breakpad is a library and tool suite that allows you to distribute an application to users with compiler-provided debugging information removed, record crashes in compact "minidump" files, send them back to your server, and produce C and C++ stack traces from these minidumps. Breakpad can also write minidumps on request for programs that have not crashed.
실행 파일에서 디버그 정보를 제거하고 "기호 파일"에 저장하는 방식으로 작동합니다. 충돌이 발생하거나 요청 시 Breakpad 클라이언트 라이브러리는 이러한 "미니 덤프"에서 충돌 정보를 생성합니다. Breakpad 미니덤프 프로세서는 이러한 파일을 기호 파일과 결합하고 사람이 읽을 수 있는 스택 추적을 생성합니다. 역시 Breakpad 설명서의 다음 그림은 이 프로세스를 설명합니다.
WPE 에서 Breakpad 지원은 처음에 downstream 2.28 branch에 의해 Vivek Arumugam에 추가되었고 백포트되었습니다upstream. 곧 출시될 2.38 버전에서 사용할 수 있으며 WebKit Flatpak SDK는 2022년 5월 말부터 Breakpad 클라이언트 라이브러리를 번들로 제공합니다.
WebKit에서 Breakpad 활성화
개발자 기능으로서 Breakpad 지원은 기본적으로 비활성화되어 있지만 WebKit을 빌드할 때 cmake에 전달
-DENABLE_BREAKPAD=1
하여 활성화할 수 있습니다. 선택적으로 미니덤프를 저장하기 위해 Breakpad에서 사용하는 경로를 하드코딩하도록 -DBREAKPAD_MINIDUMP_DIR=<some path>
설정할 수도 있습니다. 빌드 시간 동안 설정하지 않으면 BREAKPAD_MINIDUMP_DIR
는 응용 프로그램을 실행할 때 유효한 디렉토리를 가리키는 환경 변수로 설정해야 합니다. 정의된 경우 이 변수는 빌드 중에 정의된 경로도 재정의합니다.기호 생성
기호 파일을 생성하기 위해 Breakpad는
dump_syms
도구를 제공합니다. 실행 파일/라이브러리에 대한 경로를 취하고 기호 정보를 stdout으로 덤프합니다.기호 파일이 생성되면 충돌 정보와 병합할 때
minidump_stackwalk
찾을 수 있도록 특정 트리 구조에 기호 파일을 배치해야 합니다. 기호 파일이 포함된 폴더는 해당 특정 바이너리에 대해 생성된 해시 코드와 일치해야 합니다. 예를 들어 libWPEWebKit
의 경우:$ dump_syms WebKitBuild/WPE/Release/lib/libWPEWebKit-1.1.so > libWPEWebKit-1.1.so.0.sym
$ head -n 1 libWPEWebKit-1.1.so.0.sym
MODULE Linux x86_64 A2DA230C159B97DC00000000000000000 libWPEWebKit-1.1.so.0
$ mkdir -p ./symbols/libWPEWebKit-1.1.so.0/A2DA230C159B97DC00000000000000000
$ cp libWPEWebKit-1.1.so.0.sym ./symbols/libWPEWebKit-1.1.so.0/A2DA230C159B97DC00000000000000000/
충돌 로그 생성
심볼 파일 외에도 스택 정보가 있는 미니 덤프 파일이 필요하며 두 가지 방법으로 생성할 수 있습니다. 먼저 Breakpad에 생성을 요청합니다. 다른 방법은 응용 프로그램이 충돌하는 경우입니다 :)
미니덤프를 수동으로 생성하려면 Breakpad가 인식하는 충돌 신호 중 하나를 호출하거나
google_breakpad::WriteMiniDump(path, callback, context)
보낼 수 있습니다. 전자는 특정 지점에서 프로그래밍 방식으로 덤프를 생성하는 데 도움이 되는 반면 신호 접근 방식은 중단된 프로세스를 검사하는 데 도움이 될 수 있습니다. 다음은 Breakpad가 충돌 신호로 처리하는 신호입니다.SIGSEGV
SIGABRT
SIGFPE
SIGILL
(참고: 불법 지시용이며 일반용이 아닙니다SIGKILL
) SIGBUS
SIGTRAP
이제 먼저 Cog를 실행해야 합니다.
$ BREAKPAD_MINIDUMP_DIR=/home/lauro/minidumps ./Tools/Scripts/run-minibrowser --wpe --release https://www.wpewebkit.org
WebProcess
를 사용하여 SIGTRAP
충돌:$ ps aux | grep WebProcess
<SOME-PID> ... /app/webkit/.../WebProcess
$ kill -TRAP <SOME-PID>
$ ls /home/lauro/minidumps
5c2d93f2-6e9f-48cf-6f3972ac-b3619fa9.dmp
$ file ~/minidumps/5c2d93f2-6e9f-48cf-6f3972ac-b3619fa9.dmp
/home/lauro/minidumps/5c2d93f2-6e9f-48cf-6f3972ac-b3619fa9.dmp: Mini DuMP crash report, 13 streams, Thu Aug 25 20:29:11 2022, 0 type
Note: In the current form, WebKit supports Breakpad dumps in the WebProcess and NetworkProcess, which WebKit spawns itself. The developer must manually add support for it in the UIProcess (the browser/application using WebKit). The exception handler should be installed as early as possible, and many programs might do some initialization before initializing WebKit itself.
충돌 로그 번역
.dmp
충돌 로그와 기호 파일이 있으면 minidump_stackwalk
를 사용하여 사람이 읽을 수 있는 충돌 로그를 표시할 수 있습니다.$ minidump_stackwalk ~/minidumps/5c2d93f2-6e9f-48cf-6f3972ac-b3619fa9.dmp ./symbols/
<snip long header>
Operating system: Linux
0.0.0 Linux 5.15.0-46-generic #49-Ubuntu SMP Thu Aug 4 18:03:25 UTC 2022 x86_64
CPU: amd64
family 23 model 113 stepping 0
1 CPU
GPU: UNKNOWN
Crash reason: SIGTRAP
Crash address: 0x3e800000000
Process uptime: not available
Thread 0 (crashed)
0 libc.so.6 + 0xf71fd
rax = 0xfffffffffffffffc rdx = 0x0000000000000090
rcx = 0x00007f6ae47d61fd rbx = 0x00007f6ae4f0c2e0
rsi = 0x0000000000000001 rdi = 0x000056187adbf6d0
rbp = 0x00007fffa9268f10 rsp = 0x00007fffa9268ef0
r8 = 0x0000000000000000 r9 = 0x00007f6ae4fdc2c0
r10 = 0x00007fffa9333080 r11 = 0x0000000000000293
r12 = 0x0000000000000001 r13 = 0x00007fffa9268f34
r14 = 0x0000000000000090 r15 = 0x000056187ade7aa0
rip = 0x00007f6ae47d61fd
Found by: given as instruction pointer in context
1 libglib-2.0.so.0 + 0x585ce
rsp = 0x00007fffa9268f20 rip = 0x00007f6ae4efc5ce
Found by: stack scanning
2 libglib-2.0.so.0 + 0x58943
rsp = 0x00007fffa9268f80 rip = 0x00007f6ae4efc943
Found by: stack scanning
3 libWPEWebKit-1.1.so.0!WTF::RunLoop::run() + 0x120
rsp = 0x00007fffa9268fa0 rip = 0x00007f6ae8923180
Found by: stack scanning
4 libWPEWebKit-1.1.so.0!WebKit::WebProcessMain(int, char**) + 0x11e
rbx = 0x000056187a5428d0 rbp = 0x0000000000000003
rsp = 0x00007fffa9268fd0 r12 = 0x00007fffa9269148
rip = 0x00007f6ae74719fe
Found by: call frame info
<snip remaining trace>
최종 단어
이 문서에서는 Breakpad를 활성화하고 사용하여 크래시 덤프를 생성하는 방법을 간략하게 설명합니다. 향후 기사에서는 RaspberryPis와 같은 임베디드 보드에서 WPE를 실행하는 동안 Breakpad를 사용하여 크래시 덤프를 얻는 방법을 다룰 것입니다.
영형/
Reference
이 문제에 관하여(Breakpad를 사용하여 WPE WebKit으로 크래시 덤프 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/lauromoura/using-breakpad-to-generate-crash-dumps-with-wpe-webkit-5da8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)