Um aplicativo falha intermitentemente com erro ODBC genérico. O aplicativo cliente está usando ODBC para se conectar ao cluster SQL. A ativação do rastreamento ODBC mostra este erro:
StorageOnlineOp 46ec-44a8 ENTER SQLDriverConnectW
HDBC 0x012E2FD8
HWND 0x00000000
WCHAR * 0x6C228B34 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x6C228B34
SWORD -3
SWORD * 0x00000000
UWORD 0 <SQL_DRIVER_NOPROMPT>
StorageOnlineOp 46ec-44a8 EXIT SQLDriverConnectW with return code -1 (SQL_ERROR)
HDBC 0x012E2FD8
HWND 0x00000000
WCHAR * 0x6C228B34 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x6C228B34
SWORD -3
SWORD * 0x00000000
UWORD 0 <SQL_DRIVER_NOPROMPT>
DIAG [IM005] [Microsoft][ODBC Driver Manager] Driver's SQLAllocHandle on SQL_HANDLE_DBC failed (0)
De acordo com a Microsoft , o erro é explicado:
(DM) Durante o SQLConnect, o Driver Manager chamou a função SQLAllocHandle do driver com um HandleType de SQL_HANDLE_DBC e o driver retornou um erro.
Quaisquer etapas recomendadas para restringir ainda mais o problema?
De acordo com as informações da versão dos logs ODBC são:
03.80.0000 = SQLGetInfoW (SQL_ODBC_VER) 03.52 = SQLGetInfoW (SQL_DRIVER_ODBC_VER)
Nesse caso, vinculei StorageOnlineOp no log ODBC ao nome do processo StorageOnlineOpns.exe. Quando ocorreu o problema, usei o Gerenciador de Tarefas para clicar com o botão direito do mouse e "Criar arquivo de despejo"
Uma análise mostra que o processo era de 32 bits, aproximando-se do limite de espaço de endereço de 2 GB, e não conseguiu alocar memória para a conexão com o banco de dados.
Abrindo o arquivo dmp no WinDbg, usei os seguintes comandos para identificar o problema:
Este processo é de 32 bits, portanto, é limitado a 2 GB de espaço de endereço, isso está perto de se esgotar:
O código de conexão do banco de dados está falhando devido à incapacidade de alocar mais memória:
Além disso, houve um bloqueio bloqueando 4 threads. A função de bloqueio era uma função de heap. Isso é comumente encontrado em problemas de corrupção de heap.