2016-04-20 84 views
0

我正在從命令行運行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

任何意見或建議?

謝謝!

+0

你是否退出之前加入所有線程(從主函數返回)? –

+0

我沒有明確地在我的應用程序中使用多線程。我的代碼是1000行,並且問題似乎沒有特定於代碼,因爲正如我所提到的,我發現我的所有代碼都可以正常執行(通過查看日誌文件)。 –

+0

投票關閉,因爲我沒有發佈一些代碼是不公平的你。至少你可以問我是否可以先發布一些代碼(我解釋了爲什麼不)。這個問題不需要代碼。我基本上問爲什麼C++控制檯應用程序即使在達到返回0後也不會退出該進程。 –

回答

1

我解決了我的問題。

掛起由ODBC調用導致SQLFreeHandle(SQL_HANDLE_DBC, hDbc);

這裏是我的包含問題的原始代碼:

if (hStmt != SQL_NULL_HSTMT) 
    SQLFreeHandle(SQL_HANDLE_STMT, hStmt); 

if (hDbc != SQL_NULL_HDBC) { 
    SQLDisconnect(hDbc); 
    SQLFreeHandle(SQL_HANDLE_DBC, hDbc); 
} 

if (hEnv != SQL_NULL_HENV) 
    SQLFreeHandle(SQL_HANDLE_ENV, hEnv); 

由於我使用SQLDisconnect(hDbc);斷開華夏鄧白氏然後調用SQLFreeHandle(SQL_HANDLE_DBC, hDbc);導致應用掛起。代碼執行繼續並完成,但進程掛起處於等待狀態。

我刪除SQLFreeHandle(SQL_HANDLE_DBC, hDbc);後,該過程不再掛起。