Windows DLL加载时调用to_string(std::stacktrace::current())为何挂起?
关于Windows平台C++23 std::stacktrace的挂起问题
使用Visual Studio 2022 17.9.2版本,在应用程序的异常处理器中采用C++23新特性to_string(std::stacktrace::current())记录调用栈,该功能在常规场景下运行正常,但当异常发生在DLL加载(通过WIN32 API调用LoadLibraryW)过程中时,程序会直接挂起。
无需触发异常即可复现该问题:在DLL中定义全局对象,并在其构造函数中调用to_string(std::stacktrace::current()),示例代码如下:
struct A { A() { (void)to_string( std::stacktrace::current() ); } } a_;
以Windows 11系统为例,程序挂起时的调用栈如下:
ntdll.dll!NtWaitForSingleObject() KernelBase.dll!WaitForSingleObjectEx() winnsi.dll!NsiRpcRegisterChangeNotificationEx() winnsi.dll!NsiRpcRegisterChangeNotification() IPHLPAPI.DLL!InternalRegisterChangeNotification() IPHLPAPI.DLL!NotifyIpInterfaceChange() cryptnet.dll!I_CryptNetGetConnectivity() crypt32.dll!ChainGetConnectivity(void) crypt32.dll!CChainCallContext::IsConnected(void) crypt32.dll!CCertChainEngine::TriggerPreFetch() crypt32.dll!CCertChainEngine::GetChainContext() crypt32.dll!CertGetCertificateChain() wintrust.dll!_WalkChain() wintrust.dll!WintrustCertificateTrust() wintrust.dll!I_VerifyTrust() wintrust.dll!WinVerifyTrust() dbgeng.dll!DbgWinVerifyTrust(struct HWND__ *,struct _GUID *,void *) dbgeng.dll!VerifyFileSignature(unsigned short const *) dbgeng.dll!ExtensionSecurityValidate() dbgeng.dll!ExtensionInfo::Load(class DebugClient *,class TargetInfo *,unsigned short const *,bool) dbgeng.dll!TargetInfo::AddSpecificExtensions(class DebugClient *) dbgeng.dll!NotifyDebuggeeActivation(void) dbgeng.dll!LiveUserTargetInfo::WaitForEvent(unsigned long,unsigned long,unsigned long,unsigned long *) dbgeng.dll!WaitForAnyTarget(unsigned long,unsigned long,unsigned long,unsigned long,unsigned long *) dbgeng.dll!RawWaitForEvent(class DebugClient *,unsigned long,unsigned long) dbgeng.dll!DebugClient::WaitForEvent() MyDLL.dll!`anonymous namespace'::dbg_eng_data::try_initialize() Line 113 C++ MyDLL.dll!__std_stacktrace_to_string(const void * const * const _Addresses, const unsigned __int64 _Size, void * const _Str, unsigned __int64(*)(unsigned __int64, void *, void *, unsigned __int64(*)(char *, unsigned __int64, void *) noexcept) _Fill) Line 306 C++ MyDLL.dll!std::to_string(const std::basic_stacktrace<std::allocator<std::stacktrace_entry>> &) Line 343 C++ MyDLL.dll!A::{ctor}() Line 265 C++ MyDLL.dll!`dynamic initializer for 'a_''() Line 267 C++ ucrtbase.dll!_initterm() MyDLL.dll!dllmain_crt_process_attach(HINSTANCE__ * const instance, void * const reserved) Line 66 C++ ...
请问:
- 这是Windows平台下
std::stacktrace的已知限制吗? - 如何安全使用该功能(例如检测不适宜调用的时机)?
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

