1

ODBC (unixodbc) 経由で DB2 データベースを使用するソフトウェアを開発しています。問題は、valgrind でテスト スイートを実行すると大量のエラーが発生することです。1 つの接続と切断は言うまでもなく、4k エラー メッセージが生成されます (以下にコードを示します)。私の質問は:

  1. 接続と切断に何か問題がありますか?
  2. libdb2 によって割り当てられたメモリを解放するクリーンアップ機能はありますか?
  3. Valgrind にはメッセージ抑制機能もありますが、libdb2.so ライブラリの抑制ファイルは維持されていますか?

コード:

static void
connect_disconnect(SQLCHAR *dsn)
{
    SQLRETURN ret = -1;

    SQLHENV env = NULL;
    SQLHDBC dbc = NULL;

    SQLCHAR msg[1024];
    SQLSMALLINT msglen = 0;

    /* env handle */
    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
    SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

    /* connection */
    SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);

    ret = SQLDriverConnect(dbc, NULL, (SQLCHAR *)dsn,
        SQL_NTS, msg, sizeof(msg), &msglen, SQL_DRIVER_COMPLETE);
    if (!SQL_SUCCEEDED(ret))
    {
        fprintf(stderr, "Failed to connect to database '%s'.\n", dsn);
        extract_error(dbc, SQL_HANDLE_DBC);
    }

    SQLDisconnect(dbc);
    SQLFreeHandle(SQL_HANDLE_DBC, dbc);
    dbc = NULL;

    SQLFreeHandle(SQL_HANDLE_ENV, env);
    env = NULL;

    return;
}

私は使用しています:

  1. Linux 64 ビット用の DSClients-linuxx64-odbc_cli-10.1.0.2-FP002 パッケージから取得した libdb2.so。
  2. libodbc.so バージョン 2.3.1

編集

最後の valgrind メッセージ (最大のリーク):

==1318== 425,880 bytes in 1 blocks are possibly lost in loss record 145 of 145
==1318==    at 0x4C2C04B: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1318==    by 0x68B313D: _ossMemAlloc (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x6A3B513: sqlnlscmsg(char const*, SQLNLS_MSG_FILE_HEADER**, char const*, bool*, char*) (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x6A3AC90: sqlnlsMessage (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x6A3A589: sqlnlsMessage (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x6C43128: sqloMessage (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x6BDCDE0: sqllcGetMessage(char const*, int, char*, char*, unsigned long, bool, char const*) (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x6BE0F79: sqllcInitComponent(unsigned int) (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x6BE14E2: sqllcInitData() (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x6BD813C: sqllcGetInstalledKeyType (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x6C26653: sqloGetInstalledKeyType (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x6B42494: sqleuInvokeActivationRoutine(db2UCconHandle*, SQLEU_UDFSP_ARGS*, sqlca*, bool, unsigned int) (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x6B413A3: sqleuPerformServerActivationCheck(db2UCconHandle*, sqlca*) (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x6B3FF72: sqleUCappConnect (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x69E8F9A: CLI_sqlConnect(CLI_CONNECTINFO*, sqlca*, CLI_ERRORHEADERINFO*) (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x699997D: SQLConnect2(CLI_CONNECTINFO*, unsigned char*, short, unsigned char*, short, unsigned char*, short, unsigned char*, short, unsigned char) (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x69B2640: SQLDriverConnect2(CLI_CONNECTINFO*, void*, unsigned char*, short, unsigned char*, short, short*, unsigned short, unsigned char, unsigned char, CLI_ERRORHEADERINFO*) (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x698BD4E: SQLDriverConnect (in /usr/local/lib/libdb2.so.1)
==1318==    by 0x4E45962: SQLDriverConnect (in /usr/lib/libodbc.so.2.0.0)
==1318==    by 0x400BF2: connect_disconnect (in /.../db2_leak/test)
==1318==    by 0x400A8F: main (in /.../db2_leak/test)

ほとんどのリークは静的 (初期化) です。接続が切断されるたびに、確実に失われたバイト数に 80 バイトが追加されます。

valgrind の出力の少し大きい部分 (500k を超えて貼り付けることができませんでした): http://pastebin.com/xZfjy21Q

最大の問題は、自分の行動に起因する問題が見つからないことです。


編集

ダブルチェックされたバイナリ、すべて 64 ビットです。

4

0 に答える 0