Сбой с коннектором MySQL c ++ в CentOS; Связанный с библиотечным конфликтом? - PullRequest
1 голос
/ 19 мая 2011

РЕДАКТИРОВАТЬ: С тех пор я перестал использовать std :: strings в качестве аргументов этих функций, и проблемы исчезли. Кажется, это серьезная ошибка, связанная с временем жизни и областью действия строки. Хотелось бы, чтобы я понимал, что происходит немного лучше, но хотел бы оставить еще одну крошку для тех, кто может бороться с подобными аномалиями. / Edit

Итак, я пытаюсь написать процедуру доступа к базе данных с использованием коннектора MySQL C ++ (созданного из исходного кода) и получаю аномальное завершение в следующем месте кода:

//Change the active table and populate the member TableInfo object
void DatabaseInterface::ChangeTable(string tableName)
{
    string sqlString;
    int numFields;
    int numRecords;
    //Crash in this call
    connection->setSchema(tableName);
//More after this, but we never get here anyway...

После завершения программы сообщение в консоли:

   warning: .dynamic section for "/lib/libnsl.so.1" is not at the expected address
    warning: difference appears to be caused by prelink, adjusting expectations
    [Thread debugging using libthread_db enabled]
    [New Thread 0xb7fecb90 (LWP 23590)]
    [Thread 0xb7fecb90 (LWP 23590) exited]
    Traceback (most recent call last):
      File "/usr/share/gdb/python/libstdcxx/v6/printers.py", line 469, in to_string
        return self.val['_M_dataplus']['_M_p'].string (encoding, length = len)
    RuntimeError: Error reading string from inferior: Input/output error

Эта последняя RuntimeError, похоже, указывает на то, что в функцию указывается параметр nulled, и, переходя к следующему коду, я вижу, что адрес не выделяется. Отладчик видит значение, но место в памяти, кажется, не существует. Фактически, попытка просмотреть расположение переменной в окне памяти приводит к ошибке.

bool ControlInterface::GenerateCmdSet()
{
    int nRecords;
    int nFields;
    string sqlString;

    string cardCmdTable;

    cardCmdTable = "card_command";

    dbInterface.ChangeTable(cardCmdTable);

Возможно ли, что у меня возникла проблема с конфликтом библиотек или отсутствующей библиотекой? Я относительно новичок в Linux, и мне трудно это оценить, борясь с дистрибутивами, вкусами, зависимостями и т. Д.

...