3

该进程在 Windows 7 中不稳定地崩溃。我使用!analyze -v命令 inWinDbg进行异常分析。它告诉以下信息。异常实际上是由WaitForSingleObject调用的函数抛出的IrsSim!IrsNet_BlockOutput。WinDbg 的异常分析告诉我这是INVALID_POINTER_READ错误的。

对于调用代码,pChannel->hMutexis not NULL。我已经倾倒它并检查了它的价值。

IRSNETRET IrsNet_BlockOutput( IRSNET    *pChannel)
{

// Check channel
    IRSNET_CHECK_CHANNEL(pChannel);

// Wait for synchronization mutex
    switch(WaitForSingleObject(pChannel->hMutex, INFINITE))
    {
...
}

<<<<<===========

FAULTING_IP: IrsSim!Channel::SendIrsMessage+285 [s:\som5\ics\scsv\isv\test.u\irssim\irsiftransport.cpp @ 539] 00520ed5 8b06 mov eax,dword ptr [esi]

EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 77db4639 (ntdll!RtlDeactivateActivationContextUnsafeFast+0x00000058)
ExceptionCode: c0150010 ExceptionFlags: 00000001 NumberParameters: 3 Parameter[0]: 00000000 Parameter[1]: 07befc58 Parameter[2]: 00000000

DEFAULT_BUCKET_ID:INVALID_POINTER_READ

PROCESS_NAME:IrsSim.exe

ERROR_CODE: (NTSTATUS) 0xc0150010 - 被停用的激活上下文对于当前执行线程不活动。

EXCEPTION_CODE: (NTSTATUS) 0xc0150010 - 被停用的激活上下文对于当前执行线程不活动。

EXCEPTION_PARAMETER1:00000000

EXCEPTION_PARAMETER2:07befc58

EXCEPTION_PARAMETER3:00000000

STACK_TEXT: 07d2fce0 00520ed5 irssim!Channel::SendIrsMessage+0x285 07d2fd1c 00521072 irssim!CChannelArray::SendIrsMessage+0x132 07d2fd50 0052208a irssim!CNetLibInterface::SendIrsMessage+0xba 07d2fd78 005c01b6 irssim!CSendActivity::Execute+0x76 07d2fdac 005e0b3f irssim!SimulationThreadState::ExecuteOneActivity +0x11f 07d2fdf8 005cc937 irssim!CSimulationSubThreadState::ExecuteState+0x267 07d2fe8c 005ccf02 irssim!ThreadFctSubSimulation+0xf2 07d2fec4 73b1e3ee mfc90u!_AfxThreadEntry+0xf2 07d2ff4c 739f3433 msvcr90!_endthreadex+0x44 07d2ff84 739f34c7 msvcr90!_endthreadex+0xd8 07d2ff90 767d339a kernel32!BaseThreadInitThunk+0xe 07d2ff9c 77d69ed2 ntdll !__RtlUserThreadStart+0x70 07d2ffdc 77d69ea5 ntdll!_RtlUserThreadStart+0x1b

=================================

之后,我使用 !teb 命令尝试获取更多堆栈信息。

0:011> k L=07beec2c 100 ChildEBP RetAddr 07bef54c 76be0bdd ntdll!NtWaitForMultipleObjects+0x15 07bef5e8 767d1a2c KERNELBASE!WaitForMultipleObjectsEx+0x100 07bef630 767d4208 kernel32!WaitForMultipleObjectsExImplementation+0xe0 07bef64c 767f80a4 kernel32!WaitForMultipleObjects+0x18 07bef6b8 767f7f63 kernel32!WerpReportFaultInternal+0x186 07bef6cc 767f7858 kernel32! WerpReportFault+0x70 07bef6dc 767f77d7 kernel32!BasepReportFault+0x20 07bef768 77da21d7 kernel32!UnhandledExceptionFilter+0x1af 07bef770 77da20b4 ntdll!__RtlUserThreadStart+0x62 07bef784 77da1f59 ntdll!_EH4_CallFilterFunc+0x12 07bef7ac 77d76ab9 ntdll!_except_handler4+0x8e 07bef7d0 77d76a8b ntdll!ExecuteHandler2+0x26 07bef7f4 77d76a2d ntdll!ExecuteHandler +0x24 07bef880 77d40143 ntdll!RtlDispatchException+0x127 07bef880 77db4639 ntdll!KiUserExceptionDispatcher+0xf 07befc34 76be0ad7 ntdll!RtlDeactivateActivationContextUnsafeFast+0x58 07befc38 76be0abc KERNELBASE!WaitForSingleObjectEx+0xde 07befc98 767d1194 KERNELBASE!WaitForSingleObjectEx+0xc3 07befcb0 767d1148 kernel32!WaitForSingleObjectExImplementation+0x75

07befcc4 005e3b6e kernel32!WaitForSingleObject+0x12

07befcd4 00520d3b IrsSim!IrsNet_BlockOutput+0x1e

07befd14 00521072 IrsSim!Channel::SendIrsMessage+0xeb 07befd48 0052208a IrsSim!CChannelArray::SendIrsMessage+0x132 07befd70 005c01b6 IrsSim!CNetLibInterface::SendIrsMessage+0xba 07befda4 005e0b3f IrsSim!CSendActivity::Execute+0x76 07befdf0 005cc937 IrsSim!SimulationThreadState::ExecuteOneActivity+0x11f 07befe84 005ccf02 IrsSim!CSimulationSubThreadState::ExecuteState+0x267 07befebc 73b1e3ee IrsSim!ThreadFctSubSimulation+0xf2 07beff44 739f3433 mfc90u!_AfxThreadEntry+0xf2 07beff7c 739f34c7 msvcr90!_endthreadex+0x44 07beff88 767d339a msvcr90!_endthreadex+0xd8 07beff94 77d69ed2 kernel32!BaseThreadInitThunk+0xe 07beffd4 77d69ea5 ntdll!__RtlUserThreadStart +0x70 07beffec 00000000 ntdll!_RtlUserThreadStart+0x1b

=====================================>>>>>>

4

4 回答 4

3

这看起来很像 MFC 应用程序中遇到的 0xC015000f 异常(“被停用的激活上下文不是最近激活的。”)

在我遇到此异常的所有情况下,异常都不是主要问题。这是早期异常的副作用,通常是访问冲突,堆栈未正确展开。在异常处理中遗漏了使用宏(例如 AFX_MANAGE_STATE 宏)的调用帧。结果是下一次操作激活上下文时,例如通过另一个导致调用 AFX_MAINTAIN_STATE2::~AFX_MAINTAIN_STATE2 之类的程序的例程,系统检测到 cookie 不匹配并抛出异常。

在您的情况下,您可能会在一段代码中导致异常(很可能是 AV),然后由上下文异常表现出来。要捕获根本原因,请在启用第一次机会异常处理的情况下运行调试器。这样一来,可能被使用 try/catch(...) 的人在调用框架的其他地方捕获的 AV 将被暴露。由于您似乎是线程化的,因此您可能只是在内存访问上有一个竞争条件,这会导致主要异常(如果确实发生了这种情况)。

我在之前的一篇文章中看到:“其实这个问题来自于将程序从 64 位 Win XP 移植到 64 位 Win7。编译器因此从 VC6 切换到 VC9。”

这不是 MFC 中的错误。我认为,MFC 6 不包括在 Visual Studio 2005 中添加的激活上下文切换代码(基于 cookie)。所以你不会遇到这个异常。我们也认为较新的 MFC 有问题,但在我们遇到的每一种情况下,都是我们的代码导致了问题。最初的问题被以 try/catch(通常......)开始的代码流掩盖,最终调用使用 MFC 管理状态宏之一的代码,然后调用更多代码,最终会发生 AV。由于捕获在堆栈中向上,并且根据损坏情况,并非所有帧都正确展开,因此错过了 MFC 宏的背面(某些析构函数无法弹出其上下文)。更糟糕的是(用于调试),最终的上下文崩溃可能发生在代码中的任何地方(我们在 CWnd 的基本窗口消息处理路由方法中经历了很多)。我们最终创建了另一个工具供用户运行,它将自己作为调试器附加到我们的(发布目标)可执行文件,捕获第一次机会异常并创建一个 dmp 文件,以便我们可以找到自转储以来异常发生的初始点上下文异常几乎从来没有用过,因为问题的原始来源很久以前就已经执行过了。

于 2012-08-10T13:57:38.927 回答
2

呼叫以这种方式失败的唯一方法是,如果

pChannel->hMutex

是无效的。要么pChannel本身无​​效,要么hMutex. 很可能是前者。

于 2012-05-23T08:57:36.407 回答
1

看起来像是上下文停用的问题(基于 windbg 转储的想法)。参考http://blogs.msdn.com/b/junfeng/archive/2006/03/19/sxs-activation-context-activate-and-deactivate.aspx文章。

于 2012-05-23T13:48:11.540 回答
1

您应该检查句柄是否无效,而不仅仅是不NULL喜欢:

if (myHandle != INVALID_HANDLE_VALUE)
{
    // do something
}

通常创建句柄函数会在出错时返回这个值。

于 2012-05-23T10:07:01.647 回答