从堆栈上有 WerReportFault() 的小型转储中获取信息

Getting information from minidumps that have WerReportFault() on the stack

我有堆栈中有 WerpReportFault() 的故障转储,它们看起来确实不像我期望的那样。

我的期望

如果看到 WerpReportFault() 以及 0x80000003 断点,我能够使用 WinDbg 重新转储不同的异常指针,取自传递给 WerpReportFault() 的第二个参数。

我很确定这以前有效,因为我什至在 my answer over there. There are also other sites suggesting this technique, e.g. James Ross

中推荐过

我目前的观察

我正在分析的转储内部有一个 "ordinary exception",例如访问冲突:

0:000> .exr -1
ExceptionAddress: 53ec8b55
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 53ec8b55
Attempt to read from address 53ec8b55

但他们仍然有 WerpReportFault() 作为堆栈:

0:000> k
ChildEBP RetAddr  
0018f25c 74c4171a ntdll!NtWaitForMultipleObjects+0x15
0018f2f8 75181a08 KERNELBASE!WaitForMultipleObjectsEx+0x100
0018f340 75184200 kernel32!WaitForMultipleObjectsExImplementation+0xe0
0018f35c 751a80ec kernel32!WaitForMultipleObjects+0x18
0018f3c8 751a7fab kernel32!WerpReportFaultInternal+0x186
0018f3dc 751a78a0 kernel32!WerpReportFault+0x70
0018f3ec 751a781f kernel32!BasepReportFault+0x20
0018f478 7295fa2e kernel32!UnhandledExceptionFilter+0x1af

参数 2 似乎不是用于 .dump 命令的良好异常指针。

0:000> kb
ChildEBP RetAddr  Args to Child              
[...]
0018f3dc 751a78a0 0018f4a0 00000001 0018f478 kernel32!WerpReportFault+0x70
[...]

问题

是什么导致了我遇到的问题,我该如何解决?我知道这一定是可能的,因为 !analyze -v 可以告诉我真正的调用堆栈。

是因为 Visual Basic 6 和未处理的异常筛选器吗?

0018f478 7295fa2e 00000000 72a2bd04 0018f4a8 kernel32!UnhandledExceptionFilter+0x1af
0018ff80 00440fe2 00443860 7518338a 7efde000 msvbvm60!Zombie_Release+0x10fd5

我真的想要一个漂亮的调用堆栈,因为我所有的手动调试和我所有的脚本都被破坏了,它们依赖于 k!clrstack 以及类似的东西。他们无法处理堆栈上的 WerpReportFault()

所有转储都是 32 位的,正如您可以从 VB6 依赖项中想象的那样。

这样的问题是上下文错误导致的。它似乎被设置为正常的上下文记录。要将其设置为异常上下文,请使用 .ecxr。要切换回正常上下文(如您所见),请使用 .cxr