working_directory 不直接控制崩溃文件存放路径;Crashpad 用 --database 显式指定,Electron 需通过 crashpad_handler 参数或自定义启动逻辑设置 dump 目录。

在使用某些程序(尤其是基于 Chromium 的浏览器、Electron 应用或自定义崩溃上报系统)时,working_directory 通常不是直接用于指定崩溃文件(如 minidump)存放路径的配置项。真正起作用的是专门的崩溃处理配置,例如 crashpad_handler 的 --database 参数,或 Electron 中的 crashReporter.start() 的 uploadToServer 和 submitURL 等选项。但 working_directory 可能在特定上下文中间接影响崩溃文件位置——关键在于理解它在哪类工具链中被识别、如何配合使用。
确认你使用的崩溃收集工具链
不同框架对“工作目录”的解释不同:
-
Crashpad(Chromium/Electron 默认):通过
--database显式指定崩溃数据目录(如/tmp/myapp-crashes),该路径必须可写且独立于启动时的working_directory;working_directory本身不控制 dump 存放位置。 -
Breakpad(旧版):需手动调用
google_breakpad::ExceptionHandler并传入 dump 目录路径,与当前工作目录无关。 -
自定义脚本或封装层:有些启动包装脚本会把
working_directory当作相对路径基准,比如将崩溃日志写到$WORKING_DIR/crash_dumps/。此时需检查你的启动逻辑是否做了这类约定。
Electron 中正确设置崩溃 dump 路径
Electron v12+ 使用 Crashpad,默认 dump 存放在系统临时目录(如 /tmp/Crashpad/)。若要自定义:
- 启动主进程前,设置环境变量:
export CRASHPAD_HANDLER_PATH="/path/to/electron/chrome-sandbox/crashpad_handler" - 在
app.whenReady()后调用:
crashReporter.start({
productName: 'MyApp',
companyName: 'MyCo',
submitURL: 'https://example.com/crash',
uploadToServer: false,
extra: {},
compress: true
}); - ⚠️ 注意:Electron 不支持通过
working_directory改变 dump 位置;必须改用crashpad_handler --database启动参数(需自行 fork 进程并注入)。
手动指定 Crashpad database 路径(最可靠方式)
如果你有权限修改应用启动命令(如桌面端打包后的执行逻辑),可绕过 Electron 封装,直接调用底层 Crashpad:
- 找到你的应用中实际调用的
crashpad_handler可执行文件(常位于resources/app.asar.unpacked/node_modules/electron/dist/crashpad_handler) - 启动主进程时,确保 crashpad_handler 以如下方式运行:
./crashpad_handler --database=/my/custom/crashdb --metrics-dir=/my/custom/metrics --log-file=/my/custom/handler.log --monitor-self - 主程序需通过 IPC 或共享内存告知 crashpad_handler 上述 database 路径;多数情况下,这需要重写部分 native 启动逻辑。
验证崩溃文件是否写入目标路径
不要仅依赖配置,务必实测:
- 在目标路径(如
/my/custom/crashdb)下预先创建目录,并赋予当前用户读写权限 - 触发一次可控崩溃(例如在渲染进程执行
process.crash()) - 检查目标目录是否生成
pending/子目录及其中的.dmp文件 - 若无文件,检查 crashpad_handler 日志(
--log-file指定路径)是否有 “failed to open database” 类错误

















