2

我的堆栈中有故障转储,但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 位的。

4

1 回答 1

2

这样的问题是由错误的上下文引起的。它似乎设置为正常的上下文记录。要将其设置为异常上下文,请使用.ecxr. 要切换回正常上下文(您会看到),请使用.cxr

于 2016-11-17T23:13:58.860 回答