崩溃机制

NW.js崩溃时 , 将在桌面创建名为 .dmp格式的minidump报告,解码 minidump文件提取堆栈跟踪可查看问题详情。

解码 minidump文件提取堆栈跟踪,您需要三个条件:

  • 崩溃时产生的minidump文件(.dmp)
  • NW.js的Symbol文件(.sym)
  • minidump_stackwalk工具

获取minidump文件

NW.js崩溃时在不同系统中生成minidump的路径:

  • Linux: ~/.config/<name-in-manifest>/Crash\ Reports/
  • Windows: %LOCALAPPDATA%\<name-in-manifest>\User Data\CrashPad
  • Mac: ~/Library/Application\ Support/<name-in-manifest>/CrashPad/

上文的 <name-in-manifest>配置文件文件中的 name字段.

!!! “Linux Minidump文件中的Strip标头”需知: Linux系统中生成的minidump文件会附带头文本信息,解码之前必须将其剥离。真正minidump文件内容由 MDMP开头,之前的内容是不可读的 , 可以直接删除。

整理Symbol文件(.sym)

您可在NW.js下载包中找到发布的NW.js的Symbol文件. 该(.sym)文件可从下载包中提取; 注意,该(.sym)文件必须正确命名以便使用 minidump_stackwalk . minidump_stackwalk 使用了 simple symbol supplier 来查找 symbol 文件. 以下是查找symbol 文件的方式

该工具将尝试按照以下模式搜索.sym文件: {SYMBOLS_ROOT}/{DEBUG_FILE_NAME}/{DEBUG_IDENTIFIER}/{DEBUG_FILE_NAME_WITHOUT_PDB}.sym

  • {SYMBOLS_ROOT} 所有symbol 文件的根目录. NW.js所有版本或者使用系统都可以将 .sym文件放入该目录中 .
  • {DEBUG_FILE_NAME}, {DEBUG_IDENTIFIER}{DEBUG_FILE_NAME_WITHOUT_PDB} 可从 .sym 文件的首行获取,如: MODULE Linux x86_64 265BDB6BE043D5C70D3A1E279A8F0B1A0 nw.
    • 265BDB6BE043D5C70D3A1E279A8F0B1A0 对应 {DEBUG_IDENTIFIER}
    • nw 对应 {DEBUG_FILE_NAME}.
    • {DEBUG_FILE_NAME_WITHOUT_PDB} 可覆盖删除 {DEBUG_FILE_NAME} 中的 .pdb扩展, 该方式只有在Windows系统中需要 .

使用 minidump_stackwalk 解码 Minidump

minidump_stackwalk能够使用NW.js构建 . Linux和Mac系统的报告器代码中直接构建 . Windows系统中使用Cygwin预制构建 .

要从minidump 文件获取堆栈跟踪,请运行以下命令:

  1. minidump_stackwalk minidump_file.dmp /path/to/symbols_root 2>&1

如果条目文件不能正确整理 , 仍然可以使用该工具获取 . 但不能查看 , 最后部分会输出警告 - Loaded modules,如下所示:

  1. 0x00240000 - 0x02b29fff nw.exe ??? (main) (WARNING: No symbols, nw.exe.pdb, 669008F7B6EE44058CBD5F21BEB5B5CFe)

触发崩溃以测试

测试崩溃机制特性 , NW.js提供APIs触发崩溃: App.crashBrowser()App.crashRenderer(). 分别是崩溃浏览器进程和渲染进程 .

参考文献