• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用crashpad收集Web组件崩溃信息
2<!--Kit: ArkWeb-->
3<!--Subsystem: Web-->
4<!--Owner: @qq_44167590-->
5<!--Designer: @hjoksky-->
6<!--Tester: @ghiker-->
7<!--Adviser: @HelloCrease-->
8
9Web组件支持使用crashpad记录进程崩溃信息。crashpad是chromium内核提供的进程崩溃信息处理工具,在应用使用Web组件导致的进程崩溃出现后(包括应用主进程与Web渲染进程),crashpad会在应用主进程沙箱目录写入minidump文件。该文件为二进制格式,后缀为dmp,其记录了进程崩溃的原因、线程信息、寄存器信息等,应用可以使用该文件分析Web组件相关进程崩溃问题。
10
11使用步骤如下:
12
131. 在应用使用Web组件导致的进程崩溃出现后,会在应用主进程沙箱目录下产生对应的dmp文件,对应的沙箱路径如下:
14
15   ```c
16   /data/storage/el2/log/crashpad
17   ```
18
192. 参考[Native访问应用沙箱](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-file-native-side)实现访问应用沙箱dmp文件。
20
213. 获取dmp文件后进行解析,具体步骤如下:
22
23   * 通过minidump_stackwalk工具解析dmp文件,可以得到上述dmp文件对应的进程崩溃信息(崩溃的原因、线程信息、寄存器信息等),示例如下(Linux环境):
24
25     ```c
26     ./minidump_stackwalk b678e0b5-894b-4794-9ab3-fb5d6dda06a3.dmp > parsed_stacktrace.txt
27     ```
28
29     minidump_stackwalk由breakpad项目源码编译得到,编译方法见项目仓库:[breakpad仓库地址](https://chromium.googlesource.com/breakpad/breakpad)30
31   * 查看解析后的文件,以下示例列出部分内容:
32
33     ```c
34     Crash reason:  SIGSEGV /SEGV_MAPERR    表示导致进程crash的信号,此处示例为段错误
35     Crash address: 0x0
36     Process uptime: 12 seconds
37
38     Thread 0 (crashed)                     表示Thread 0发生crash
39      0  libweb_engine.so + 0x2e0b340       0层调用栈,0x2e0b340为so偏移地址,可用来反编译解析crash源码(依赖unstripped so)
40          x0 = 0x00000006a5719ff8    x1 = 0x000000019a5a28c0
41          x2 = 0x0000000000020441    x3 = 0x00000000000001b6
42          x4 = 0x0000000000000018    x5 = 0x0000000000008065
43          x6 = 0x0000000000008065    x7 = 0x63ff686067666d60
44          x8 = 0x0000000000000000    x9 = 0x5f129cf9e7bf008c
45         x10 = 0x0000000000000001   x11 = 0x0000000000000000
46         x12 = 0x000000069bfcc6d8   x13 = 0x0000000009a1746e
47         x14 = 0x0000000000000000   x15 = 0x0000000000000000
48         x16 = 0x0000000690df4850   x17 = 0x000000010c0d47f8
49         x18 = 0x0000000000000000   x19 = 0x0000005eea827db8
50         x20 = 0x0000005eea827c38   x21 = 0x00000006a56b1000
51         x22 = 0x00000006a8b85020   x23 = 0x00000020002103c0
52         x24 = 0x00000006a56b8a70   x25 = 0x0000000000000000
53         x26 = 0x00000006a8b84e00   x27 = 0x0000000000000001
54         x28 = 0x0000000000000000    fp = 0x0000005eea827c10
55          lr = 0x000000069fa4b33c    sp = 0x0000005eea827c10
56          pc = 0x000000069fa4b340
57         Found by: given as instruction pointer in context
58      1  libweb_engine.so + 0x2e0b338
59          fp = 0x0000005eea827d80    lr = 0x000000069fa48d44
60          sp = 0x0000005eea827c20    pc = 0x000000069fa4b33c
61         Found by: previous frame's frame pointer
62      2  libweb_engine.so + 0x2e08d40
63          fp = 0x0000005eea827e50    lr = 0x00000006a385cef8
64          sp = 0x0000005eea827d90    pc = 0x000000069fa48d44
65         Found by: previous frame's frame pointer
66      3  libweb_engine.so + 0x6c1cef4
67          fp = 0x0000005eea828260    lr = 0x00000006a0f11298
68          sp = 0x0000005eea827e60    pc = 0x00000006a385cef8
69      ......
70     ```
71
72   * 使用llvm工具链解析crash源码位置,示例如下(Linux环境):
73
74     ```c
75     ./llvm-addr2line -Cfpie libweb_engine.so 0x2e0b340
76     ```
77
78     llvm-addr2line工具链位于sdk中。
79<!--no_check-->