C++控制台应用程序未返回
C++ console application not returning
我正在从命令行运行一个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);
后,进程不再挂起。
相关文章:
- 返回主窗口/ C ++后,应用程序正在关闭
- 将数组作为多线程应用程序中函数的返回传递
- DoModal 主应用程序随机返回 -1 代码
- 使用Outlook 2016:MAPISendMail在Windows应用程序中失败,并返回"MAPI_E_FAILURE"作为错误代码
- 当 C++11 应用程序使用非 C++11 库时返回值损坏
- 如何将命令从c++应用程序返回到父终端
- 从 mfc 应用程序点击网络服务,并希望从网络服务登录方法读取用户代码返回
- 从 MFC(c++) 应用程序启动的可执行 jar 中获取返回值
- C++协变返回类型应用程序
- Qt 5.2 DLL返回与应用程序调用DLL不同的结果
- 从ASP.NET应用程序查询Active Directory对象属性将返回旧结果
- 从我的c++应用程序调用c#dll(解析XML文件),将数组/列表返回给c++
- C++控制台应用程序未返回
- PEM_read_RSA_PUBKEY返回并中断应用程序
- 将指针从库返回到应用程序
- 如何在.NET Visual Basic应用程序中读取从C++DLL返回的const char*
- 启动 VirtualBoxSDK 测试应用程序返回错误"Error creating virtual box instance"
- waveOutWrite 缓冲区永远不会返回到应用程序
- C++/Visual Studio - _wgetcwd返回项目文件夹而不是应用程序
- 控制台应用程序返回一个奇怪的值