【问题标题】:Meaning of hex number in Windows crash dialogWindows 崩溃对话框中十六进制数字的含义
【发布时间】:2009-07-07 13:42:38
【问题描述】:

时不时地(咳咳……)我的代码在某些系统上崩溃;很多时候,我的用户会发送 Windows 崩溃对话框的屏幕截图。例如,我最近收到了这个:

launcher2g.exe 中未处理的 win32 异常 @ 0x3a009598: 0xC00000005:访问冲突写入位置 0x00000000。

我很清楚(由于 0xc0000005 代码以及写出的错误消息)我在我的 launcher2g.exe 进程中的某处跟踪一个空指针。我不清楚的是“0x3a009598”数字的意义。这是存储汇编程序指令的进程地址空间中的代码偏移量,触发了问题吗?

假设 0x3a000000 是 launcher2g.exe 模块加载到进程中的位置,我使用 Visual Studio 调试器检查 0x3a009598 处的汇编代码,但不幸的是,这只是很多“int 3”指令(这是一个调试版本,所以有很多 int 3 填充)。

我一直想知道如何充分利用这些 @ 0x12345678 数字 - 如果这里有人可以阐明它,或者分享一些进一步解释的指针,那就太好了。

更新:如果将来有人发现这个问题,这是我发现的一个非常有趣的读物,它解释了如何理解我上面引用的错误消息:Finding crash information using the MAP file

【问题讨论】:

    标签: windows debugging crash hex


    【解决方案1】:

    0x3a009598 将是导致崩溃的 x86 指令的地址。

    EXE 通常在其首选加载地址加载 - 通常为 0x04000000 iirc。所以它可能离0x3a009598很远。进程加载的某些DLL可能位于此地址。

    如果您可以让用户生成并发送故障转储,那么故障转储通常是调试此类事情的最有用方法。您可以使用 Visual Studio 2005 及更高版本加载它们并获得系统 dll 的自动符号解析。

    接下来,您的构建过程生成的 .map 文件应该可以帮助您确定有问题的函数 - 假设您确实设法找出崩溃所在的 exe/dll 模块,以及它的实际加载地址是什么。

    XP 用户可以使用 DrWatsn32 生成故障转储并向您发送。在 Vista 及更高版本上,Windows 错误报告将故障转储写入 c:\users\\AppData\Local\Temp*.mdmp

    【讨论】:

    • 是的,在那个地址有一个 DLL,我知道是哪个(它恰好是我开发的一个 DLL,我的应用程序链接到它)。关于 Vista 上的故障转储的一条评论:我需要以某种方式启用它们吗?我经历了几次崩溃,但在 %TEMP% 中看不到 mdmp 文件。感谢您提供指向 .map 文件的指针,我会调查一下!
    • 认为 mdmp 文件可能仅在用户选择将错误报告发送到 Windows 错误报告时才会出现。显然,如果您使用适当的证书对应用程序文件进行数字签名,那么您显然可以通过某种方式从 Microsoft 获取用户通过“向 MS 报告此错误并查看是否有任何修复”对话框提交的故障转储。显示。我无法就此选项的简单性和成本效益提出建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2013-04-28
    • 2013-05-12
    • 2015-01-06
    • 2016-07-24
    • 2019-12-26
    相关资源
    最近更新 更多