Ошибка сегментации в sqlcxt () - PullRequest
1 голос
/ 12 марта 2011

Я использую приведенную ниже функцию в своем коде C для подключения к базе данных Oracle.Приведенная ниже функция вызывает ошибку сегментации, когда работа в другое время

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"

Ответы [ 2 ]

0 голосов
/ 10 апреля 2012

У меня было много подобных проблем (при использовании Oracle 8.1.7), и большая часть того, что я нашел в сети, просто говорит: Oracle Bug (особенно, если sqlcxt в конечном итоге вызывает lxchcsn

У меня была программа с 25 потоками, которая, казалось, работала. Я изменил некоторые настройки, что означало увеличение частоты обращений к БД, и эта проблема начала возникать. Когда я поместил мьютексы вокруг вызовов БД, проблема исчезла (что странно, потому что я мог видеть 25 отдельных соединений БД - у каждого потока был свой контекст) - и добавление мьютексов в некотором роде отрицательно сказывается на многопоточности.

В принципе, я думаю, что это проблема Oracle

0 голосов
/ 12 марта 2011

В отчете отладчика ошибка сегмента связана с доступом к недоступной памяти.

Я бы предложил два места для проверки. (a) Проверьте входной параметр 'string' для значений NULL перед его использованием. (б) Используйте strncpy() вместо strcpy()

...