我正在從命令行運行C++控制檯應用程序。應用程序使用ODBC從數據庫系統查詢數據並將數據轉儲到文本文件中。有時候,特別是在同時運行很少的情況下,應用程序不會返回,而是等待命令提示符。我甚至不能用ctrl-C來停止它。我必須使用任務管理器或ProcMon中的End-Task。我在代碼中的每一步使用fprintf並寫入一個單獨的日誌文件,並且我看到應用程序到達最後,並且應該稱爲return 0
。當它沒有掛起時,應用程序需要大約40秒來查詢和轉儲數據。當應用程序掛起時,我發現日誌文件和數據轉儲文件按預期生成。 我使用ProcMon,我看到線程正在等待自己。我收到此消息:C++控制檯應用程序不返回
odbcsql.exe的一個或多個線程處於等待狀態。
這是我通過將procmon找到堆棧跟蹤:
- ntoskrnl.exe中KeSynchronizeExecution函數+ 0x2246
- ntoskrnl.exe中KeWaitForMultipleObjects + 0x135e
- ntoskrnl.exe中KeWaitForMultipleObjects + 0xdd9!
- ntoskrnl.exe!KeWaitForSingleObject + 0x373
- ntoskrnl.exe!KeStallWhileFrozen + 0x1977
- ntoskrnl.exe中!KeIsAttachedProcess + 0x95d
- ntoskrnl.exe中!KeWaitForMultipleObjects + 0x152f
- ntoskrnl.exe中!KeWaitForMultipleObjects + 0xdd9
- ntoskrnl.exe中!則函數+ 0x373
- ntoskrnl.exe中!NtWaitForSingleObject + 0xb2
- ntoskrnl.exe中!setjmpex + 0x34a3
- wow64cpu.dll!TurboDispatchJumpAddressEnd + 0x598
- wow64cpu.dll!TurboDispatchJumpAddressEnd + 0x3e4
- wow64.dll!Wow64LdrpInitialize + 0x23a
- wow64.dll!Wow64LdrpInitialize + 0x172
- ntdll.dll中!LdrInitShimEngineDynamic + 0x23d5
- ntdll.dll中!memset的+ 0xdd1e
- ntdll.dll中!LdrInitializeThunk + 0xe
- UMEngx86.dll + 0x242f
- UMEngx86.dll + 0x1ec5
- [email protected]+0x1ba4
- UMEngx86.dll!_RegQ ueryValueExW @ 24 + 0x18b2
- [email protected]+0x17f4
- ntdll.dll中!RtlInitializeCriticalSection + 0x10e
- ntdll.dll中!RtlInitializeCriticalSection +均爲0x88
- ntdll.dll中!RtlReportSilentProcessExit +量0x108
- ntdll.dll!RtlExitUserProcess + 0x81
- odbcsql。EXE + 0x2f0c
- odbcsql.exe + 0x3185
- ntdll.dll中!RtlInitializeExceptionChain +值爲0x8F
- ntdll.dll中!RtlInitializeExceptionChain + 0x5a
任何意見或建議?
謝謝!
你是否退出之前加入所有線程(從主函數返回)? –
我沒有明確地在我的應用程序中使用多線程。我的代碼是1000行,並且問題似乎沒有特定於代碼,因爲正如我所提到的,我發現我的所有代碼都可以正常執行(通過查看日誌文件)。 –
投票關閉,因爲我沒有發佈一些代碼是不公平的你。至少你可以問我是否可以先發布一些代碼(我解釋了爲什麼不)。這個問題不需要代碼。我基本上問爲什麼C++控制檯應用程序即使在達到返回0後也不會退出該進程。 –