连接MySQL时出现分段错误

时间:2013-02-19 18:47:55

标签: c++ mysql linux segmentation-fault mysql-connector

我在一个与MySQL数据库建立连接的大项目中有这个代码,但是不起作用:

boost::shared_ptr<sql::Connection> connection;

sql::Driver *driver = get_driver_instance();
assert(driver != 0);

std::string server = "servname", user = "pietro", password = "abc";

try
{
    connection.reset(driver->connect(server, user, password));
    assert(connection != 0);

    if(connection->isClosed() == false)     // <-- segmentation fault
    {
    }

}

我指出了一个分段错误(所有参数都有效) 但是,这个相同的代码适用于测试项目。

使用调试器进入sql::Connection::isClosed()成员函数,我没有获得有关可能原因的信息;这是我得到的地方:

  

mysql-connector-c ++ - 1.0.5 / driver / mysql_connection.cpp - 第430行

/* {{{ MySQL_Connection::checkClosed() -I- */
void
MySQL_Connection::checkClosed()
{
    CPP_ENTER_WL(intern->logger, "MySQL_Connection::checkClosed");
    if (!intern->is_valid) {
        throw sql::SQLException("Connection has been closed");
    }
}

checkClosed()函数从之前的connection.reset()成功执行了七次。 “intern”指针的值不会更改,在此阶段不为null。

当我检查连接是否关闭时,再次运行checkClosed()功能。现在“intern”指针值为0x8,这是我无法访问的位置。

我在这里得到SIGSEGV分段错误。

如果您想要反汇编的代码,请告诉我......

平台:
MySQL 5.x
MySQL Connector / C ++ 1.0.5
Linux - OpenSuse 11.4


P.S .: 我注意到所有shared_ptr的成员函数都按预期工作:

connection.get();          // = 0x8fb4a0
connection.use_count();    // = 1
connection.unique();       // = 1

而在指向对象上完成的所有调用都会导致分段错误(SIGABRT):

connection->getClientInfo();
connection->isClosed();

1 个答案:

答案 0 :(得分:0)

您的连接已删除,或者您的内存已损坏。使用valgrind找到答案