You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在浏览器显示"Aww snap"页面时向Logrocket/Datadog记录错误日志?

捕获并记录Chrome "Aww snap" 内存耗尽错误到外部日志工具

由于"Aww snap"错误是浏览器进程崩溃导致的,此时前端JS执行会完全停止,无法在崩溃发生时直接上报日志。以下是几种可行的方案,帮你追踪这类问题:

1. 内存阈值预报警告

在崩溃发生前监控内存使用情况,当达到危险阈值时提前上报,为后续排查提供线索。Chrome支持performance.memory API(非标准但稳定可用),可以定时检查内存使用率:

// 每5秒检查一次内存状态
setInterval(() => {
  if (!performance.memory) return;
  
  const { usedJSHeapSize, totalJSHeapSize } = performance.memory;
  const usageRatio = usedJSHeapSize / totalJSHeapSize;

  // 当内存使用率超过90%时,触发预警上报
  if (usageRatio > 0.9) {
    // 上报到Datadog RUM
    datadogRum.addError('Memory usage critical threshold exceeded', {
      memoryUsageRatio: usageRatio.toFixed(2),
      usedJSHeapSize: formatBytes(usedJSHeapSize),
      totalJSHeapSize: formatBytes(totalJSHeapSize),
      currentUrl: window.location.href,
      lastUserAction: getLastUserAction() // 自定义函数,记录用户最后操作
    });

    // 上报到Logrocket
    LogRocket.captureMessage('Memory usage approaching crash threshold', {
      level: 'error',
      extra: {
        memoryUsageRatio: usageRatio.toFixed(2),
        usedJSHeapSize,
        totalJSHeapSize
      }
    });
  }
}, 5000);

// 辅助函数:格式化字节数为可读格式
function formatBytes(bytes) {
  if (bytes === 0) return '0 Bytes';
  const k = 1024;
  const sizes = ['Bytes', 'KB', 'MB', 'GB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}

2. 崩溃后回溯检测

利用本地存储标记页面状态,在用户刷新页面后检测是否发生过崩溃,从而上报日志:

window.addEventListener('load', () => {
  const crashMarker = localStorage.getItem('pageCrashMarker');
  if (crashMarker) {
    // 上报崩溃事件
    datadogRum.addError('Page crashed with "Aww snap"', {
      crashType: 'memory_exhaustion',
      crashTimestamp: crashMarker,
      affectedUrl: window.location.href
    });

    LogRocket.captureMessage('Page crashed: "Aww snap" error', {
      level: 'critical',
      extra: {
        crashType: 'memory_exhaustion',
        crashTimestamp: new Date(parseInt(crashMarker)).toISOString()
      }
    });

    localStorage.removeItem('pageCrashMarker');
  }

  // 设置崩溃标记
  localStorage.setItem('pageCrashMarker', Date.now().toString());
});

// 页面正常卸载时清除标记
window.addEventListener('beforeunload', () => {
  localStorage.removeItem('pageCrashMarker');
});

3. 利用日志工具的内置崩溃追踪

  • Logrocket:默认支持捕获浏览器崩溃事件,包括"Aww snap"场景。它会通过会话重放和页面加载异常检测来关联崩溃前后的用户行为,只需确保正确初始化SDK即可。
  • Datadog RUM:开启崩溃检测功能后,会自动捕获进程崩溃事件,无需额外编写上报逻辑,只需在初始化时配置好RUM参数。

关键注意事项

  • 预报警告无法100%覆盖所有崩溃场景,但能提供崩溃前的内存状态,帮助定位内存泄漏点。
  • 回溯检测依赖用户刷新页面,如果用户直接关闭标签页,无法捕获到崩溃事件。
  • performance.memory仅在Chrome及基于Chromium的浏览器中可用,其他浏览器需要用替代方案(如结合自定义内存统计的性能指标)。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:01:07