C++ CRT区域设置关键部分上的死锁

C++ CRT区域设置关键部分上的死锁,c++,visual-studio,visual-c++,windbg,msvcrt,C++,Visual Studio,Visual C++,Windbg,Msvcrt,讨论应用程序错误: 大多数应用程序线程很少陷入相同重复的死锁。死锁在Windows XP和后者上大约每月重现一次 关于我们大型项目的基本信息: 当错误在客户机器上重现时,项目被构建为发布目标 使用/EHa编译的应用程序有时可能会隐藏访问冲突和其他系统异常。 (请不要用省略号讨论好的或坏的练习挡块) 项目由纯、纯CLR和混合CLR程序集(C++;C#;C++\CLI)组成 MSVS 2013 大多数应用程序线程使用线程本地C语言环境模式 等待CRT区域设置关键部分的大多数线程(CRT源上的代

讨论应用程序错误:

大多数应用程序线程很少陷入相同重复的死锁。死锁在Windows XP和后者上大约每月重现一次

关于我们大型项目的基本信息:

当错误在客户机器上重现时,项目被构建为发布目标

使用/EHa编译的应用程序有时可能会隐藏访问冲突和其他系统异常。 (请不要用省略号讨论好的或坏的练习挡块)

项目由纯、纯CLR和混合CLR程序集(C++;C#;C++\CLI)组成

MSVS 2013

大多数应用程序线程使用线程本地C语言环境模式

等待CRT区域设置关键部分的大多数线程(CRT源上的代码为“\u mlock(\u SETLOCALE\u LOCK)”),例如WinDbg\u ID=44的线程

等待加载器关键部分的其他线程,例如WinDbg_ID=23的线程

可能有23个线程在CRT源内部进入CRT区域设置关键部分,并没有离开它

44线程在_CRTDLL_INIT/dllmain之前进入加载器临界区,并在执行DLL_thread_ATTACH时在_CRTDLL_INIT/dllmain处等待crt区域设置临界区

dllmain是默认生成的

必须保留区域设置关键部分,因为_munlock(_SETLOCALE_LOCK)应该位于CRT源的uu finally块

可能是在进入CRT区域设置关键部分后,以及在没有离开CRT区域设置关键部分时,发生了一些系统异常

有点不寻常:过程中有3个模块:

  • msvcr80.dll-由sqlncli10.dll加载
  • msvcr120.dll
  • msvcr120_clr0400.dll
问题:

有人有什么想法或解释吗

是否可以从单个线程调用来自不同CRT版本的CRT区域设置函数?这可能会由于CRT差异而损坏线程本地CRT区域设置数据内存。在进入CRT区域设置关键部分后,发生了一些系统异常。是真的吗


可以跳过最后一个区块吗?跳过场景?

我们可能找到了答案,并将在实践中对此进行测试

我们在反异常处理程序中的每个非C++异常上运行回溯记录器,并在发生时捕获堆栈跟踪。锁定区域设置CS后的访问冲突

我们以多线程的方式在我们的项目中使用了第三方库ZipArchive。在这个库中,CZipString::MakeLower\CZipString::MakeUpper深处的函数生成局部静态变量std::locale,这是在多线程情况下C++98/MsVs 2013的UB。它很少只破坏栈顶并调用代码段中的随机代码,而不正确地展开堆栈,也不离开区域设置CS。然后发生访问冲突,线程状态由/EHa和catch(…)“还原”。在未正确的堆栈展开后,线程卡在另一个CS上


谢谢大家。

也许我们找到了答案,并将在实践中对此进行测试

我们在反异常处理程序中的每个非C++异常上运行回溯记录器,并在发生时捕获堆栈跟踪。锁定区域设置CS后的访问冲突

我们以多线程的方式在我们的项目中使用了第三方库ZipArchive。在这个库中,CZipString::MakeLower\CZipString::MakeUpper深处的函数生成局部静态变量std::locale,这是在多线程情况下C++98/MsVs 2013的UB。它很少只破坏栈顶并调用代码段中的随机代码,而不正确地展开堆栈,也不离开区域设置CS。然后发生访问冲突,线程状态由/EHa和catch(…)“还原”。在未正确的堆栈展开后,线程卡在另一个CS上


谢谢大家。

也许我们找到了答案,并将在实践中对此进行测试

我们在反异常处理程序中的每个非C++异常上运行回溯记录器,并在发生时捕获堆栈跟踪。锁定区域设置CS后的访问冲突

我们以多线程的方式在我们的项目中使用了第三方库ZipArchive。在这个库中,CZipString::MakeLower\CZipString::MakeUpper深处的函数生成局部静态变量std::locale,这是在多线程情况下C++98/MsVs 2013的UB。它很少只破坏栈顶并调用代码段中的随机代码,而不正确地展开堆栈,也不离开区域设置CS。然后发生访问冲突,线程状态由/EHa和catch(…)“还原”。在未正确的堆栈展开后,线程卡在另一个CS上


谢谢大家。

也许我们找到了答案,并将在实践中对此进行测试

我们在反异常处理程序中的每个非C++异常上运行回溯记录器,并在发生时捕获堆栈跟踪。锁定区域设置CS后的访问冲突

我们以多线程的方式在我们的项目中使用了第三方库ZipArchive。在这个库中,CZipString::MakeLower\CZipString::MakeUpper深处的函数生成局部静态变量std::locale,这是在多线程情况下C++98/MsVs 2013的UB。它很少只破坏栈顶并调用代码段中的随机代码,而不正确地展开堆栈,也不离开区域设置CS。然后发生访问冲突,线程状态由/EHa和catch(…)“还原”。在未正确的堆栈展开后,线程卡在另一个CS上


谢谢大家。

您有使用
CreateThread()的代码吗?
?您应该将其替换为
\u beginthreadex()
(或者类似的内容,请参阅文档)。关于三个MSVCR库,请使用“dependency walker”检查依赖关系树,以确定它们是否直接由同一模块使用。如果是这样的话,那肯定是错误的,如果不是这样的话,它仍然可能是错误的,但不一定是错误的。存在大量的死锁,各种各样,而不仅仅是语言环境。看起来炸弹爆炸了。您无法在此处获得帮助。@UlrichEckhardt我们的代码不使用