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

Windows系统中是否有macOS崩溃转储的等效功能?

Windows 下类似 macOS 崩溃转储的功能

1. 自动生成崩溃转储文件

Windows 默认会在进程因未处理异常(比如对应 macOS SIGSEGV 的内存访问违例)崩溃时生成转储文件,主要分两类:

  • 小型转储(Minidump):默认存储路径为 C:\Windows\Minidump,体积小,包含进程关键状态信息,适合快速定位问题。
  • 完整转储:可通过系统设置开启,默认路径是 C:\Windows\MEMORY.DMP,包含进程全部内存数据,适合深度排查复杂问题。

2. 对应 macOS atos 的转储分析工具

  • WinDbg:微软官方调试工具,是分析转储的核心工具:
    • 先配置符号路径(指向本地 PDB 文件或微软符号服务器),加载调试符号。
    • 执行 !analyze -v 命令自动分析崩溃原因,直接输出崩溃的代码位置、调用栈详情。
    • 用 u 命令反汇编指定地址,k 命令查看完整调用栈。
  • Visual Studio:可直接打开转储文件,借助熟悉的调试界面定位代码位置,适合日常开发场景。

3. 自定义捕获异常并生成转储

如果需要主动在代码中生成转储(而非依赖系统自动生成),可以在自定义异常处理函数中调用 MiniDumpWriteDump 函数,替代单纯用 SetUnhandledExceptionFilter 记录状态:

#include <DbgHelp.h>
#include <windows.h>

LONG WINAPI CustomExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo) {
    HANDLE hDumpFile = CreateFile(L"AppCrashDump.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hDumpFile != INVALID_HANDLE_VALUE) {
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ExceptionPointers = pExceptionInfo;
        dumpInfo.ClientPointers = TRUE;
        
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithFullMemory, &dumpInfo, NULL, NULL);
        CloseHandle(hDumpFile);
    }
    return EXCEPTION_EXECUTE_HANDLER;
}

int main() {
    SetUnhandledExceptionFilter(CustomExceptionHandler);
    // 程序逻辑代码
    return 0;
}

注意编译时需要链接 DbgHelp.lib 库。

分析内存访问违例的通用方法

不管是 Windows 还是 macOS,通用排查思路一致:

  • 获取崩溃上下文:拿到崩溃地址、调用栈、寄存器状态,这是定位问题的核心依据。
  • 匹配调试符号:必须拥有程序对应的调试符号(Windows 是 PDB,macOS 是 dSYM),否则只能看到汇编地址,无法关联到源代码行。
  • 回溯调用栈:从崩溃点向上遍历调用栈,找到用户代码中触发异常的具体位置,排查空指针、野指针、数组越界、内存重复释放等常见问题。
  • 检查内存状态:如果是完整转储,可查看崩溃地址附近的内存数据,判断是访问了未分配内存、已释放内存还是受保护内存区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:35:22