C++控制台应用程序未返回

C++ console application not returning

本文关键字:返回 应用程序 控制台 C++      更新时间:2023-10-16

我正在从命令行运行一个C++控制台应用程序。应用程序使用ODBC从数据库系统查询数据,并将数据转储到文本文件中。偶尔,尤其是当同时运行几个应用程序时,应用程序不会返回,而让命令提示符等待。我甚至无法停止使用ctrl-C。我必须使用"任务管理器"或ProcMon中的"结束任务"。我在代码中的每一步都使用fprintf,并写入一个单独的日志文件,我看到应用程序到达了末尾,应该称为return 0。当它没有挂起时,应用程序大约需要40秒来查询和转储数据。当应用程序挂起时,我看到日志文件和数据转储文件是按预期生成的。我使用ProcMon,看到线程正在等待自己。我收到这个消息:

odbcsql.exe的一个或多个线程处于等待状态。

这是我通过ProcMon:找到的堆栈跟踪

  • ntoskrnl.exe!KeSynchronizeExecution+0x2246
  • ntoskrnl.exe!KeWaitForMultipleObjects+0x135e
  • ntoskrnl.exe!KeWaitForMultipleObjects+0xdd9
  • ntoskrnl.exe!KeWaitForSingleObject+0x373
  • ntoskrnl.exe!KeStallWhile冻结+0x1977
  • ntoskrnl.exe!KeIsAttachedProcess+0x95d
  • ntoskrnl.exe!KeWaitForMultipleObjects+0x152f
  • ntoskrnl.exe!KeWaitForMultipleObjects+0xdd9
  • ntoskrnl.exe!KeWaitForSingleObject+0x373
  • ntoskrnl.exe!NtWaitForSingleObject+0xb2
  • ntoskrnl.exe!setjmpex+0x34a3
  • wow64cpu.dll!TurboDispatchJumpAddressEnd+0x598
  • wow64cpu.dll!TurboDispatchJumpAddressEnd+0x3e4
  • wow64.dll!Wow64Ldrp初始化+0x23a
  • wow64.dll!Wow64Ldrp初始化+0x172
  • ntdll.dll!LdrInitShimEngineDynamic+0x23d5
  • ntdll.dll!内存集+0xdd1e
  • ntdll.dll!LdrInitializeThunk+0xe
  • UMEngx86.dll+0x242f
  • UMEngx86.dll+0x1ec5
  • UMEngx86.dll!_RegQueryValueExW@24+0x1ba4
  • UMEngx86.dll!_RegQueryValueExW@24+0x18b2
  • UMEngx86.dll!_RegQueryValueExW@24+0x17f4
  • ntdll.dll!RtlInitializeCriticalSection+0x10e
  • ntdll.dll!RtlInitializeCriticalSection+0x88
  • ntdll.dll!RtlReportSilentProcessExit+0x108
  • ntdll.dll!Rtl退出用户进程+0x81
  • odbcsql.exe+0x2f0c
  • odbcsql.exe+0x3185
  • ntdll.dll!RtlInitializeExceptionChain+0x8f
  • ntdll.dll!Rtl初始化异常链+0x5a

有什么想法或建议吗?

谢谢!

我解决了我的问题。

挂起是由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);断开hDbc的连接,因此对SQLFreeHandle(SQL_HANDLE_DBC, hDbc);的调用导致应用程序挂起。代码执行继续并完成,但进程挂起处于等待状态。

删除SQLFreeHandle(SQL_HANDLE_DBC, hDbc);后,进程不再挂起。