Windows崩溃对话框中十六进制数的含义

Windows崩溃对话框中十六进制数的含义,windows,debugging,crash,hex,Windows,Debugging,Crash,Hex,偶尔(嗯…)我的代码在某些系统上崩溃;我的用户经常发送Windows崩溃对话框的屏幕截图。例如,我最近收到了: Unhandled win32 exception @ 0x3a009598 in launcher2g.exe: 0xC00000005: Access violation writing location 0x00000000. launcher2g.exe中未处理的win32异常@0x3A0009598: 0xC00000005:访问冲突写入位置0x00000000。 我很清楚(

偶尔(嗯…)我的代码在某些系统上崩溃;我的用户经常发送Windows崩溃对话框的屏幕截图。例如,我最近收到了:

Unhandled win32 exception @ 0x3a009598 in launcher2g.exe: 0xC00000005: Access violation writing location 0x00000000. launcher2g.exe中未处理的win32异常@0x3A0009598: 0xC00000005:访问冲突写入位置0x00000000。 我很清楚(由于0xc0000005代码以及写出的错误消息),我在launcher2g.exe进程的某个地方跟踪一个空指针。我不清楚的是“0x3A0009598”数字的意义。这是否是进程地址空间中存储汇编指令的代码偏移量触发了问题

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

我一直想知道如何充分利用这些@0x12345678数字——如果这里有人能解释一下,或者分享一些进一步解释的建议,那就太好了


更新:如果将来有人发现这个问题,下面是我发现的一篇非常有趣的文章,它解释了如何理解错误消息,正如我上面引用的那样:。

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

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

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

接下来,生成过程生成的.map文件应该可以帮助您确定有问题的函数——假设您能够设法找出崩溃发生在哪个exe/dll模块中,以及它的实际加载地址


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

是的,该地址上有一个DLL,我知道是哪个地址(碰巧是我开发的一个DLL,我的应用程序链接它)。关于Vista上崩溃转储的一条评论是:我是否需要以某种方式启用它们?我经历了几次崩溃,但没有看到%TEMP%中的mdmp文件。不过,感谢您提供指向.map文件的指针,我将对此进行研究!我认为只有当用户选择将错误报告发送到Windows错误报告时,才会出现mdmp文件。显然,有一种方法可以让你,如果你用正确的证书对你的应用程序文件进行数字签名,你就可以从微软那里得到崩溃转储,用户可以通过操作系统显示的“向微软报告此错误并查看是否有任何修复”对话框提交。我不知道这个选择有多容易,有多划算。