web-dev-qa-db-ja.com

診断する次のステップODBC SQL_HANDLE_DBCのSQLAllocHandleが失敗しました

アプリケーションが断続的に一般的なODBCエラーで失敗します。クライアントアプリケーションはODBCを使用してSQLクラスターに接続します。=有効にするODBCトレースはこのエラーを示します:

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) 

Microsoft によると、エラーは説明されています:

(DM)SQLConnect中に、ドライバーマネージャーがSQL_HANDLE_DBCのHandleTypeを指定してドライバーのSQLAllocHandle関数を呼び出し、ドライバーがエラーを返しました。

問題をさらに絞り込むための推奨手順はありますか?

ODBCログのバージョン情報によると:

03.80.0000 = SQLGetInfoW(SQL_ODBC_VER)03.52 = SQLGetInfoW(SQL_DRIVER_ODBC_VER)

1

この場合、StorageOnlineOpをODBC log to process name StorageOnlineOpns.exeにリンクしました。問題が発生したとき、タスクマネージャを使用してプロセスを右クリックし、「ダンプファイルを作成」​​しました。

分析の結果、プロセスは32ビットプロセスであり、2 GBのアドレススペース制限に近づいており、データベース接続にメモリを割り当てることができませんでした。

WinDbgでdmpファイルを開き、次のコマンドを使用して問題を特定しました。

    0:011> lmvm StorageOnlineOpns
Browse full module list
start    end        module name
00170000 002b9000   StorageOnlineOpns   (export symbols)       StorageOnlineOpns.exe
    Loaded symbol image file: StorageOnlineOpns.exe
    Image path: D:\Program Files (x86)\Enterprise Vault\StorageOnlineOpns.exe
    Image name: StorageOnlineOpns.exe
    Browse all global symbols  functions  data
    Timestamp:        Wed May  1 11:23:18 2013 (51806E86)
    CheckSum:         0014CE8C
    ImageSize:        00149000
    File version:     10.0.3.1188
    Product version:  10.0.3.0
    File flags:       0 (Mask 3F)
    File OS:          4 Unknown Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Symantec Corporation
    ProductName:      Enterprise Vault
    InternalName:     STORAGEONLINEOPNS
    OriginalFilename: STORAGEONLINEOPNS.DLL
    ProductVersion:   10, 0, 3, 0
    FileVersion:      10.0.3.1188
    FileDescription:  StorageOnlineOpns Module
    LegalCopyright:   Copyright (c) 2013 Symantec Corporation. All rights reserved. Use of this product is subject to license terms.

このプロセスは32ビットであるため、2 GBのアドレス空間に制限されています。これは、使い果たされそうです。

0:011> !heap -s                                    
Mapping file section regions...
Mapping module regions...
Mapping PEB regions...
Mapping TEB and stack regions...
Mapping heap regions...
Mapping page heap regions...
Mapping other regions...
Mapping stack trace database regions...
Mapping activation context regions...

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Heap                                    669          6a04c000 (   1.657 GB)  86.08%   82.83%
<unknown>                               397           85b5000 ( 133.707 MB)   6.79%    6.53%
Image                                   712           58ea000 (  88.914 MB)   4.51%    4.34%
Free                                    406           4d72000 (  77.445 MB)            3.78%
Stack                                   153           3300000 (  51.000 MB)   2.59%    2.49%
Other                                    46             5f000 ( 380.000 kB)   0.02%    0.02%
TEB                                      51             33000 ( 204.000 kB)   0.01%    0.01%
PEB                                       1              1000 (   4.000 kB)   0.00%    0.00%

--- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_PRIVATE                            1201          73d79000 (   1.810 GB)  94.06%   90.50%
MEM_IMAGE                               741           5b38000 (  91.219 MB)   4.63%    4.45%
MEM_MAPPED                               87           19cd000 (  25.801 MB)   1.31%    1.26%

--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_COMMIT                             1605          6f65a000 (   1.741 GB)  90.45%   87.03%
MEM_RESERVE                             424           bc24000 ( 188.141 MB)   9.55%    9.19%
MEM_FREE                                406           4d72000 (  77.445 MB)            3.78%

--- Protect Summary (for commit) - RgnCount ----------- Total Size -------- %ofBusy %ofTotal
PAGE_READWRITE                          902          68c29000 (   1.637 GB)  85.06%   81.85%
PAGE_EXECUTE_READ                       135           3e04000 (  62.016 MB)   3.15%    3.03%
PAGE_READONLY                           382           2960000 (  41.375 MB)   2.10%    2.02%
PAGE_WRITECOPY                           83            1fc000 (   1.984 MB)   0.10%    0.10%
PAGE_READWRITE|PAGE_GUARD               103             d1000 ( 836.000 kB)   0.04%    0.04%

--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
Heap                                         dd10000            fd0000 (  15.813 MB)
<unknown>                                   7f0e0000            f00000 (  15.000 MB)
Image                                       6a611000            e70000 (  14.438 MB)
Free                                        72f4a000            1c6000 (   1.773 MB)
Stack                                        1980000             fd000 (1012.000 kB)
Other                                       7efb0000             23000 ( 140.000 kB)
TEB                                         7ef19000              1000 (   4.000 kB)
PEB                                         7efde000              1000 (   4.000 kB)

より多くのメモリを割り当てることができないため、データベース接続コードは失敗しています:

0:011> k
 # ChildEBP RetAddr  
00 031ac570 73b217cd ntdll!NtWaitForSingleObject+0x15
01 031ac5b0 73b27696 mswsock!SockWaitForSingleObject+0x3a
02 031ac62c 764b689f mswsock!WSPRecv+0x2af
03 031ac674 739616c7 ws2_32!recv+0x87
04 031ac6c4 5510b4a2 dbnetlib!ConnectionRead+0x429
05 031ac700 5514ceb2 sqloledb!CDataSource::ConnectionRead+0x82
06 031ac754 550f9056 sqloledb!CDBConnection::GetBytesFromWire+0x228
07 031ac7a4 551888e0 sqloledb!CDBConnection::ProcessTDSStream+0x1d6
08 031ac858 55121a4f sqloledb!CStmt::SQLExecRPC+0x61b
09 031ac894 550f88cb sqloledb!CCommand::ExecuteHelper+0x232
0a 031ac920 550ff5c6 sqloledb!CCommand::Execute+0x127c
0b 031ac960 57e5a335 sqloledb!CImpICommandText::Execute+0x16f
0c 031ac9a0 57e52c8b msado15!CConnection::Execute+0x9c
0d 031acbd8 57e5573b msado15!_ExecuteAsync+0x1e1
0e 031acbf4 57e556f7 msado15!ExecuteAsync+0x6f
0f 031acd24 57e54ecf msado15!CQuery::Execute+0x10f5
10 031acd88 57eabd39 msado15!CCommand::_Execute+0x192
11 031acfe0 57ead171 msado15!CCommand::ExecuteWithModeFlag+0x8da
12 031ad00c 5acb4406 msado15!CCommand::Execute+0x5e
WARNING: Stack unwind information not available. Following frames may be wrong.
13 031ad28c 5aca7a1f AdoInterface!CADODataAccess::ExecuteSQLCommand+0x266
14 031ad2b4 5853ff29 AdoInterface!CADODataAccess::ExecuteStoredProcedure+0x1f
15 00000000 00000000 EVFingerprintCatalogueAccessor!CRegistryHelper::IsOpen+0x15bb9
0:011> !gle
LastErrorValue: (Win32) 0 (0) - The operation completed successfully.
LastStatusValue: (NTSTATUS) 0xc0000017 - {Not Enough Quota}  Not enough virtual memory or paging file quota is available to complete the specified operation.

さらに、4つのスレッドをブロックするロックがありました。ブロッキング関数はヒープ関数でした。これは、ヒープの破損の問題でよく見られます。

0:004> k
 # ChildEBP RetAddr  
00 026eed5c 77a1ebae ntdll!NtWaitForSingleObject+0x15
01 026eedc0 77a1ea92 ntdll!RtlpWaitOnCriticalSection+0x13e
02 026eede8 77a1ece9 ntdll!RtlEnterCriticalSection+0x150
03 026eeed4 77a02bd5 ntdll!RtlpFreeHeap+0x96
04 026eeef4 75b06e8a ntdll!RtlFreeHeap+0x142
05 026eef08 7671d9f6 ole32!CRetailMalloc_Free+0x1c [d:\w7rtm\com\ole32\com\class\memapi.cxx @ 687] 
06 026eef1c 7671daad oleaut32!_SafeArrayFreeData+0x1f
07 026eef2c 766dfdf0 oleaut32!_SafeArrayReleaseData+0x37
08 026eef4c 766dfd5c oleaut32!_SafeArrayDestroyData+0x81
09 026eef68 766f0fc3 oleaut32!_SafeArrayDestroy+0xa0
0a 026eef8c 766f133c oleaut32!LPSAFEARRAY_UserFree+0x10e
0b 026eefa0 759f7c1e oleaut32!VARIANT_UserFree+0xae
0c 026eefd8 759f4256 rpcrt4!NdrUserMarshalFree+0x37
0d 026eeff8 75a7083e rpcrt4!NdrPointerFree+0xa8
0e 026ef01c 75a7072a rpcrt4!NdrpFreeParams+0x145
0f 026ef030 75a706e0 rpcrt4!NdrStubCall2+0x4eb
10 026ef428 75bee7e6 rpcrt4!NdrStubCall2+0x42a
11 026ef470 75bee876 ole32!CStdStubBuffer_Invoke+0xb6 [d:\w7rtm\com\rpc\ndrole\stub.cxx @ 1590] 
12 026ef4b8 75beedd0 ole32!SyncStubInvoke+0x3c [d:\w7rtm\com\ole32\com\dcomrem\channelb.cxx @ 1187] 
13 026ef504 75b08a6b ole32!StubInvoke+0xb9 [d:\w7rtm\com\ole32\com\dcomrem\channelb.cxx @ 1396] 
14 026ef5e0 75b08960 ole32!CCtxComChnl::ContextInvoke+0xfa [d:\w7rtm\com\ole32\com\dcomrem\ctxchnl.cxx @ 1262] 
15 026ef5fc 75b09532 ole32!MTAInvoke+0x1a [d:\w7rtm\com\ole32\com\dcomrem\callctrl.cxx @ 2105] 
16 026ef628 75beeccd ole32!STAInvoke+0x46 [d:\w7rtm\com\ole32\com\dcomrem\callctrl.cxx @ 1924] 
17 026ef65c 75beeb41 ole32!AppInvoke+0xab [d:\w7rtm\com\ole32\com\dcomrem\channelb.cxx @ 1086] 
18 026ef740 75bef1fd ole32!ComInvokeWithLockAndIPID+0x372 [d:\w7rtm\com\ole32\com\dcomrem\channelb.cxx @ 1724] 
19 026ef768 75b0938f ole32!ComInvoke+0xc5 [d:\w7rtm\com\ole32\com\dcomrem\channelb.cxx @ 1469] 
1a 026ef77c 75b0934e ole32!ThreadDispatch+0x23 [d:\w7rtm\com\ole32\com\dcomrem\chancont.cxx @ 298] 
1b 026ef7c0 760f62fa ole32!ThreadWndProc+0x161 [d:\w7rtm\com\ole32\com\dcomrem\chancont.cxx @ 654] 
1c 026ef7ec 760f6d3a user32!InternalCallWinProc+0x23
1d 026ef864 760f77c4 user32!UserCallWinProcCheckWow+0x109
1e 026ef8c4 760f788a user32!DispatchMessageWorker+0x3b5
1f 026ef8d4 001cc7d4 user32!DispatchMessageW+0xf
WARNING: Stack unwind information not available. Following frames may be wrong.
20 026ef938 001cc8a9 StorageOnlineOpns+0x5c7d4
21 026ef974 752634c7 StorageOnlineOpns+0x5c8a9
22 026ef980 7650336a msvcr90!_endthreadex+0xd8
23 026ef98c 77a09902 kernel32!BaseThreadInitThunk+0xe
24 026ef9cc 77a098d5 ntdll!__RtlUserThreadStart+0x70
25 026ef9e4 00000000 ntdll!_RtlUserThreadStart+0x1b
1