ошибка сегментации mysql_init(NULL)

У меня есть следующая функция:

int get_tcounter(char *meterType, int *error) {
    MYSQL *conn = mysql_init(NULL);
    get_connection(conn, DB_HOST, DB_USER, DB_PW, DB); 

    MYSQL_STMT *stmt = mysql_stmt_init(conn);
    if (!stmt) {
        log_to_console("Init stmt failed: %s\n", mysql_error(conn));
        exit(1);
    }
    prepare_stmt(conn, stmt, GET_TCOUNTER_SQL);

    MYSQL_BIND param[1], res[1];
    memset(param, 0, sizeof(param));
    memset(res, 0, sizeof(res));

    char *paramBuff;
    int tcBuff;
    my_bool isNullParam[] = {0}, isNullRes[] = {0};

    paramBuff = meterType;

    bind_string_param(&param[0], strlen(meterType), paramBuff, &isNullParam[0], (unsigned long *) 0);
    bind_result(&res[0], MYSQL_TYPE_LONG, (char *) &tcBuff, &isNullRes[0], (unsigned long *) 0);

    execute_statement(stmt, param, res);

    *error = TRUE;
    int ret = 0;
    if (!mysql_stmt_fetch(stmt)) {
        ret = tcBuff;
        *error = FALSE;
    }

    mysql_stmt_close(stmt);
    mysql_close(conn);

    return ret;
}

В первый раз, когда я запускаю функцию, все работает, как и ожидалось, но во второй раз строка mysql_init выдает ошибку сегментации.

Вот дамп ядра:

Program terminated with signal 11, Segmentation fault.
#0  0x00007fe23ee22f08 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) down
Bottom (innermost) frame selected; you cannot go down.
(gdb) up
#1  0x00007fe23ee24536 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) up
#2  0x00007fe23ee270b5 in malloc () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) up
#3  0x00007fe23fa951d2 in my_malloc () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
(gdb) up
#4  0x00007fe23fa788df in mysql_init () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
(gdb) up
#5  0x0000000000403ed4 in get_tcounter (meterType=0x24bcbd0 "M-9669-8", error=0x7fff6b57a8a8) at database/data_access.c:284
284     MYSQL *conn = mysql_init(NULL);

Странно то, что в первом вызове conn это 0x0 перед инициализацией, а во второй раз это какой-то произвольный 0x7fff... адрес.

Привязанное назначение NULL для соединения и освобождение соединения перед инициализацией безрезультатно.


person mkvcvc    schedule 12.10.2012    source источник
comment
В многопоточных средах вы должны вызывать mysql_library_init< /а> первый.   -  person jww    schedule 18.02.2019


Ответы (2)


Есть большая вероятность, что это повреждение памяти, которое приводит к плохому состоянию MySQL. Попробуйте запустить это под Valgrind, чтобы увидеть, нет ли двойного free или какого-либо недопустимого доступа.

person apmasell    schedule 12.10.2012

Не связывайте библиотеку отладки (libmysqld.lib), я тестирую ее на win10+mysql5.6 5.7+vs2017, mysql_init всегда возвращает NULL или вылетает. Вы должны связать библиотеку выпуска (libmysql.lib).

person liuaifu    schedule 08.08.2017
comment
Похоже, что вопрос касается Linux, поэтому я думаю, что решение для Windows здесь не очень полезно. - person Ken Y-N; 08.08.2017