【问题标题】:setlocale stuck on Windowssetlocale 卡在 Windows 上
【发布时间】:2016-02-23 08:48:30
【问题描述】:

setlocale(LC_ALL, "uk-UA") 有时会因为未知原因而挂起/死锁。调用堆栈是:

ntdll.dll!_ZwWaitForSingleObject@12()   Unknown
ntdll.dll!_RtlpWaitOnCriticalSection@8()    Unknown
ntdll.dll!_RtlEnterCriticalSection@4()  Unknown
ntdll.dll!_LdrpLoadDll@28() Unknown
ntdll.dll!_LdrLoadDll@16()  Unknown
KernelBase.dll!_LoadLibraryExW@12() Unknown
ucrtbased.dll!__crt_findfile_traits::get_invalid_value(void)    Unknown
ucrtbased.dll!__acrt_lock_and_call<class <lambda_a463b7b0560cfcaf9b17f27c6ef46564> >(enum __acrt_lock_id,class <lambda_a463b7b0560cfcaf9b17f27c6ef46564> &&)    Unknown
ucrtbased.dll!__acrt_lock_and_call<class <lambda_a463b7b0560cfcaf9b17f27c6ef46564> >(enum __acrt_lock_id,class <lambda_a463b7b0560cfcaf9b17f27c6ef46564> &&)    Unknown
ucrtbased.dll!__acrt_lock_and_call<class <lambda_a463b7b0560cfcaf9b17f27c6ef46564> >(enum __acrt_lock_id,class <lambda_a463b7b0560cfcaf9b17f27c6ef46564> &&)    Unknown
ucrtbased.dll!__acrt_lock_and_call<class <lambda_a463b7b0560cfcaf9b17f27c6ef46564> >(enum __acrt_lock_id,class <lambda_a463b7b0560cfcaf9b17f27c6ef46564> &&)    Unknown
ucrtbased.dll!__acrt_lock_and_call<class <lambda_a463b7b0560cfcaf9b17f27c6ef46564> >(enum __acrt_lock_id,class <lambda_a463b7b0560cfcaf9b17f27c6ef46564> &&)    Unknown
ucrtbased.dll!___acrt_can_use_vista_locale_apis()   Unknown
ucrtbased.dll!__expandlocale()  Unknown
ucrtbased.dll!__wsetlocale()    Unknown
ucrtbased.dll!__crt_call_and_cleanup<class <lambda_565169b3e3b494427ce1bebdd17b54ac>,class <lambda_f51fe5fd7c79a33db34fc9310f277369> >(class <lambda_565169b3e3b494427ce1bebdd17b54ac> &&,class <lambda_f51fe5fd7c79a33db34fc9310f277369> &&)   Unknown
ucrtbased.dll!__crt_seh_guarded_call<void>::operator()<class <lambda_0f92d0c5a8007722f95b3b6c71cd8e3e>,class <lambda_321f9d61c14d59ff00145e45db1313e0> &,class <lambda_3298c911d7b53f44106027a7fde9a80a> >(class <lambda_0f92d0c5a8007722f95b3b6c71cd8e3e> &&,class <lambda_321f9d61c14d59ff00145e45db1313e0> &,class <lambda_3298c911d7b53f44106027a7fde9a80a> &&) Unknown
ucrtbased.dll!__acrt_lock_and_call<class <lambda_321f9d61c14d59ff00145e45db1313e0> >(enum __acrt_lock_id,class <lambda_321f9d61c14d59ff00145e45db1313e0> &&)    Unknown
ucrtbased.dll!__crt_call_and_cleanup<class <lambda_565169b3e3b494427ce1bebdd17b54ac>,class <lambda_f51fe5fd7c79a33db34fc9310f277369> >(class <lambda_565169b3e3b494427ce1bebdd17b54ac> &&,class <lambda_f51fe5fd7c79a33db34fc9310f277369> &&)   Unknown
ucrtbased.dll!__crt_seh_guarded_call<void>::operator()<class <lambda_507d9fd6b66e39451a8852ba73f804a7>,class <lambda_565169b3e3b494427ce1bebdd17b54ac> &,class <lambda_f51fe5fd7c79a33db34fc9310f277369> &>(class <lambda_507d9fd6b66e39451a8852ba73f804a7> &&,class <lambda_565169b3e3b494427ce1bebdd17b54ac> &,class <lambda_f51fe5fd7c79a33db34fc9310f277369> &) Unknown
ucrtbased.dll!__crt_call_and_cleanup<class <lambda_565169b3e3b494427ce1bebdd17b54ac>,class <lambda_f51fe5fd7c79a33db34fc9310f277369> >(class <lambda_565169b3e3b494427ce1bebdd17b54ac> &&,class <lambda_f51fe5fd7c79a33db34fc9310f277369> &&)   Unknown
ucrtbased.dll!__wsetlocale()    Unknown
ucrtbased.dll!___acrt_update_multibyte_info()   Unknown
ucrtbased.dll!_setlocale()  Unknown

有时它会起作用,但有时它永远不会从它那里返回。我无法确定原因。我使用 Visual Studio 2015 和 Windows 7。

【问题讨论】:

  • 您遗漏了调用堆栈的底部,因此我们无法看到您从哪里调用setlocale。由于您遇到了加载程序锁死锁,您是否可能从DllMain 调用setlocale
  • 天哪! 4 小时后,我终于找到了正确的搜索词。似乎我在 Win7 机器上使用稍微不同的调用堆栈遇到了同样的错误。 (ucrtbase.dll10.0.10240.16390 (th1_st1.150714-1601))

标签: c windows visual-studio winapi


【解决方案1】:

这是通用 CRT 的 TH1 版本 (10.0.10240) 中的一个错误。该错误已在 Windows 11 月 10 日更新 (TH2) 版本 (10.0.10586) 中修复。

您可以从https://dev.windows.com/en-us/downloads/windows-10-sdk 下载并安装更新的 Windows 10 SDK。此 SDK 包含静态通用 CRT 库、调试通用 CRT DLL(ucrtbased.dll 等)以及用于应用本地重新分发的零售通用 CRT DLL。

您可以从https://www.microsoft.com/en-us/download/details.aspx?id=50410 下载更新的通用 CRT 可再发行组件。这些包含更新的零售通用 CRT,用于系统目录中的集中部署。

【讨论】:

  • James:您能否快速浏览一下:stackoverflow.com/questions/37196005/… 根据您的建议,我已安装适用于 Windows 7 SP1 的 KB3118401。我的困惑是它现在在“%programfiles%\Windows Kits”下创建了一个“10”文件夹。我应该将我的应用程序与 this 文件夹上安装的 ucrt 链接吗?这有点令人困惑:-(
  • 如何从 Visual Studio 2015 使用这个 UCRT?即使在安装了 VS update 2 和 Win 10 SDK TH2 之后,它仍然在 UCRT 10.0.10240 中链接(我使用的是静态 CRT 模式 /MT)。
  • 假设我有 Windows 10 LTSB 版本 1507 (RTM)。如何在通用 CRT 中修复此错误?是更新到 LTSB 版本 1607 的唯一选择吗?
猜你喜欢
  • 1970-01-01
  • 2021-07-31
  • 2012-03-18
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多