1

Oracle データベースに接続するために、C コードで以下の関数を使用しています。以下の関数は、別の時間に作業中にセグメンテーション違反を引き起こしています

static int Connect(char *string)
{
EXEC SQL BEGIN DECLARE SECTION;
    static char login[80];
EXEC SQL END DECLARE SECTION;

    strcpy((char *)login, string);

    EXEC SQL CONNECT :login ;

    if (sqlca.sqlcode < 0) 
        return(-1);
    return(0);
}

以下は、コア ファイルで生成されたデバッガ レポートです。これに関する提案。

program terminated by signal SEGV (no mapping at the fault address)
0xffffffffffffffff:     <bad address 0xffffffffffffffff>
Current function is Connect
    375    sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);

  [20] 0xffffffff7e587078(0x0, 0x100210f80, 0xffffffff7fffc850, 0x1000e4dd0, 0xff000000000000, 0x8080808080808080), at 0xffffffff7e587078
=>[21] login(orastring = 0xffffffff7fffcef8 "user123/abcd@sunn.adams"), line 375 in "connect.c"
4

2 に答える 2

0

多くの同様の問題があり(Oracle 8.1.7を使用)、ネットで見つけたもののほとんどは単純に次のように述べています:Oracleバグ(特にsqlcxtが最終的にlxchcsnを呼び出す場合)

動作しているように見える25個のスレッドを実行するプログラムがありました。DB 呼び出しの頻度の増加を意味するいくつかの設定を変更すると、この問題が発生し始めました。DB 呼び出しの周りにミューテックスを配置すると、問題が解消され (25 の個別の DB 接続を確認できたので奇妙です。各スレッドには独自のコンテキストがありました)、ミューテックスを配置すると、マルチスレッドの目的が無効になります。

基本的に、それはオラクルの問題だと思います

于 2012-04-10T01:10:46.577 に答える
0

デバッガーのレポートによると、seg fault はアクセスできないメモリにアクセスしたことが原因です。

いくつかのチェックを入れる場所を2つ提案します。(a) 入力パラメータ'string'NULL使用する前に値を確認してください。(b)strncpy()の代わりに使用strcpy()

于 2011-03-11T23:25:00.930 に答える