我的堆栈中有故障转储,但WerpReportFault()
它们看起来并不像我期望的那样。
我的期望
如果已经看到WerpReportFault()
0x80000003 断点,并且我能够使用 WinDbg 使用不同的异常指针重新转储,这些异常指针取自传递给WerpReportFault()
.
我很确定这以前是有效的,因为我什至在我的回答中推荐了这一点。还有其他网站建议使用这种技术,例如James Ross
我目前的观察
我正在分析的转储内部有一个“普通异常”,例如访问冲突:
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()
在堆栈上处理。
正如您可以从 VB6 依赖项中想象的那样,所有转储都是 32 位的。