Мы запускаем нашу 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
Мы пришли к выводу, что программа действительно зависала из-за другой проблемы. Мы использовали инструмент диагностики отладки Microsoft для создания аварийных дампов. Иногда мы получаем два аварийных дампа для одного и того же идентификатора процесса. Мы думаем, что это связано с тем, что первый дамп был получен, когда в mqsec.dll было сгенерировано исключение. Более поздний сбой был вызван реальной проблемой. Мы предполагаем, что первое исключение было поймано где-то в DLL-файлах Microsoft и что вызов _MQOpenQueue наконец-то вернулся, возможно, с ошибкой. Однако исключительная ситуация создала файл аварийного дампа с указанной выше трассировкой стека.
Мы переключили наш метод получения аварийных дампов на этом сайте на установку значения ключа реестра, как показано здесь:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb787181(v=vs.85).aspx
И это помогло нам сконцентрироваться на реальном сбое и не отвлекаться на другие исключения, которые были брошены и пойманы.