You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何同时将Electron crashReporter的minidump文件上传至远程服务器并本地存储?

解决Electron CrashReporter同时上传服务器与本地保留Dump文件的问题

我之前也碰到过一模一样的需求——既要把崩溃报告上传到远程服务器,又得在本地留一份.dmp文件以防上传失败。你遇到的情况其实是Electron的默认行为:当uploadToServer设为true时,它会在成功上传崩溃文件后自动清理本地的.dmp文件,所以你在临时目录里找不到它。

下面给你两个可靠的解决方案:

方案一:使用自定义上传器(Custom Uploader)备份文件

这是最直接的方法,利用Electron提供的customUploader钩子,在上传崩溃报告之前手动把.dmp文件复制到你指定的本地目录,之后再执行上传操作。

示例代码(主进程中):

const { app, crashReporter } = require('electron');
const fs = require('fs').promises;
const path = require('path');

// 定义本地存储崩溃dump的目录,比如用应用的用户数据目录,不会被系统临时清理
const localCrashStorageDir = path.join(app.getPath('userData'), 'LocalCrashDumps');

// 确保目录存在
async function initLocalCrashDir() {
  try {
    await fs.access(localCrashStorageDir);
  } catch {
    await fs.mkdir(localCrashStorageDir, { recursive: true });
  }
}

// 初始化崩溃报告器
async function setupCrashReporter() {
  await initLocalCrashDir();

  crashReporter.start({
    productName: 'YourAppName',
    submitURL: 'https://your-crash-report-server.com/upload',
    uploadToServer: true,
    customUploader: async (uploadOptions) => {
      // 从uploadOptions中获取dump文件的路径
      const sourceDumpPath = uploadOptions.crashDmpPath;
      const dumpFileName = path.basename(sourceDumpPath);
      const targetDumpPath = path.join(localCrashStorageDir, dumpFileName);

      try {
        // 复制dump文件到本地目录
        await fs.copyFile(sourceDumpPath, targetDumpPath);
        console.log(`本地备份崩溃dump成功:${targetDumpPath}`);
      } catch (err) {
        console.error('本地备份崩溃dump失败:', err);
      }

      // 执行默认的上传逻辑,也可以在这里实现自己的上传代码
      return crashReporter.uploadCrashReport(uploadOptions);
    }
  });
}

// 应用就绪后初始化
app.whenReady().then(setupCrashReporter);

方案二:监听崩溃事件手动备份(备选)

如果你不想自定义上传器,也可以尝试监听appchild-process-crashed事件(针对渲染进程崩溃),不过这种方法的可靠性不如自定义上传器,因为有些极端崩溃可能无法触发事件,仅作为补充方案:

app.on('child-process-crashed', (event, childProcess, details) => {
  // details中包含crash dump的路径,需根据Electron版本确认字段兼容性
  if (details.crashDmp) {
    const targetPath = path.join(localCrashStorageDir, path.basename(details.crashDmp));
    fs.copyFile(details.crashDmp, targetPath).catch(err => console.error(err));
  }
});

注意事项

  • 一定要选择非临时目录来存储本地dump文件,比如应用的userData目录,避免被系统的临时文件清理机制删掉。
  • 确保应用有对应目录的读写权限,尤其是在Windows/macOS的沙箱环境下。
  • 测试时可以通过process.crash()在主进程触发崩溃,或者在渲染进程用window.crash()来验证功能是否正常。

内容的提问来源于stack exchange,提问作者aabuhijleh

火山引擎 最新活动