在应用Microsoft更新后,MSMQ在MQOpenQueue上抛出异常

MSMQ throws exception on MQOpenQueue after Microsoft updates are applied

本文关键字:MQOpenQueue 抛出异常 MSMQ 应用 Microsoft 更新      更新时间:2023-10-16

我们正在运行我们的c++程序(用VS2008编译)作为服务并调用MQOpenQueue。应用Microsoft更新后

KB3065979
KB3054205
KB3064209
KB3063858
KB3040272
KB3059317
KB3058515

到Windows server 2008 r2 SP1企业机器,所有对MQOpenQueue的调用都失败了。删除更新后,这个问题仍然存在,直到重新安装MSMQ。然后它正常工作了不到一天,然后又开始零星地出现。

抛出的异常是异常码0xE06D7363.

这是堆栈

KERNELBASE.dll!_RaiseException@16 ()    Unknown
msvcrt.dll!__CxxThrowException@8 () Unknown
mqsec.dll!ThrowMissingValue(class RegEntry const &,long)    Unknown
mqsec.dll!registry_access_error::`scalar deleting destructor'(unsigned int) Unknown
mqsec.dll!CmQueryValue(class RegEntry const &,unsigned char * *,unsigned long *)    Unknown
mqsec.dll!MQSec_GetWorldSid(void)   Unknown
mqsec.dll!MQSec_GetLocalMachineSid(int,unsigned long *) Unknown
mqrt.dll!RTpGetThreadUserSid(int *,int *,unsigned char * *,unsigned long *) Unknown
mqrt.dll!RTSecurityContextBase::InitializeUserInfo(void)    Unknown
mqrt.dll!InternalSecurityContext::CreateSecurityContext(void)   Unknown
mqrt.dll!RtpOpenQueue(wchar_t const *,unsigned long,unsigned long,unsigned long *)  Unknown
mqrt.dll!_MQOpenQueue@16 () Unknown

我们的结论是程序实际上是由于不同的问题而崩溃的。我们使用微软的调试诊断工具来生成崩溃转储。对于同一个进程ID,我们有时会遇到两个崩溃转储。我们认为,这是由于在mqsec.dll中抛出异常时获得的第一个转储。后来的崩溃转储是由于真正的问题。我们猜测,第一个异常是在Microsoft的dll中捕获的,对_MQOpenQueue的调用最终返回了,可能是一个错误。但是,该异常生成了一个崩溃转储文件,其中包含上述堆栈跟踪信息。

我们将获取此站点崩溃转储的方法改为设置注册表项的值,如下所示:

https://msdn.microsoft.com/en-us/library/windows/desktop/bb787181 (v = vs.85) . aspx

这帮助我们专注于真正的崩溃,而不是被抛出和捕获的其他异常分散注意力。