Have an issue with ODBC Driver 17 for SQL Server.
Application hangs on exit when trying to use ODBC driver in static object that create another thread.
The code works fine with ODBC Driver 13 and below but hangs with ODBC Driver 17.
Issue appeared in release build 32/64 bit and not in debug build.
Have a sample code that reproduce the issue but MS Q&A does not allow to attach it to this post.
main thread stack (just wait second thread to join):
ntdll.dll!_NtWaitForSingleObject@12 () Unknown
KernelBase.dll!WaitForSingleObjectEx() Unknown
msvcp140.dll!_Thrd_join(Thrd_t thr, int * code) Line 57 C++
[Inline Frame] HangOdbc2.exe!std::thread::join() Line 130 C++
[Inline Frame] HangOdbc2.exe!SQLThread::{dtor}() Line 62 C++
HangOdbc2.exe!`dynamic atexit destructor for 'theThread''() C++
ucrtbase.dll!<lambda>(void)() Unknown
ucrtbase.dll!crt_seh_guarded_call<...>::operator()<...>() Unknown
ucrtbase.dll!<lambda>(void)() Unknown
ucrtbase.dll!_crt_seh_guarded_call<...>::operator()<...>() Unknown
ucrtbase.dll!common_exit() Unknown
ucrtbase.dll!exit () Unknown
HangOdbc2.exe!scrt_common_main_seh() Line 310 C++
kernel32.dll!@BaseThreadInitThunk@12 () Unknown
ntdll.dll!RtlUserThreadStart() Unknown
ntdll.dll!_RtlUserThreadStart@8 () Unknown
second thread with ODBC driver:
ntdll.dll!NtWaitForAlertByThreadId@8()
ntdll.dll!RtlpWaitOnAddressWithTimeout()
ntdll.dll!RtlpWaitOnCriticalSection()
ntdll.dll!RtlpEnterCriticalSectionContended()
ntdll.dll!RtlEnterCriticalSection@4()
ucrtbase.dll!crt_seh_guarded_call<...>::operator()<...>()
ucrtbase.dll!execute_onexit_table()
msodbcsql17.dll!scrt_dllmain_uninitialize_c()
msodbcsql17.dll!dllmain_crt_process_detach()
msodbcsql17.dll!dllmain_crt_dispatch()
msodbcsql17.dll!dllmain_dispatch()
msodbcsql17.dll!_DllMainCRTStartup@12()
ntdll.dll!_LdrxCallInitRoutine@16()
ntdll.dll!LdrpCallInitRoutine()
ntdll.dll!LdrpProcessDetachNode()
ntdll.dll!LdrpUnloadNode()
ntdll.dll!LdrpDecrementModuleLoadCountEx()
ntdll.dll!LdrUnloadDll()
KernelBase.dll!FreeLibrary()
odbc32.dll!FreeDriverInfo()
odbc32.dll!_FreeDriverList@0()
odbc32.dll!UninitializeDll()
odbc32.dll!SQLFreeHandle()
[Inline Frame] HangOdbc2.exe!SQLConnection::CloseConnection() Line 34
HangOdbc2.exe!SQLThread::Process() Line 57
[Inline Frame] HangOdbc2.exe!std::invoke(void(SQLThread::)() &&) Line 1601
HangOdbc2.exe!std::thread::_Invoke<...>(void RawVals) Line 56
ucrtbase.dll!thread_start<...>()
kernel32.dll!@BaseThreadInitThunk@12()
ntdll.dll!RtlUserThreadStart()
ntdll.dll!_RtlUserThreadStart@8()
The ODBC Driver 17 for SQL Server version 2017.0177.0001.01 ((DS_Main).170626-2112)
The same situation with 2017.0177.0002.01 ((DS_Main).170626-2112)
