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를 사용하여 크래시 덤프를 얻는 방법을 다룰 것입니다.

    영형/

    좋은 웹페이지 즐겨찾기