【问题标题】:Segmentation fault when connecting to MySQL连接 MySQL 时出现分段错误
【发布时间】:2013-02-19 18:47:55
【问题描述】:

我在一个与 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”指针的值在这个阶段不会改变并且不为空。

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

这里我得到一个SIGSEGV,分段错误。

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

平台:
MySQL 5.x
MySQL 连接器/C++ 1.0.5
Linux - OpenSuse 11.4


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

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

虽然对指向对象的所有调用都会导致分段错误(SIGABRT):

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

【问题讨论】:

  • 在'intern'之前定义了哪个成员变量?错误一定在其他地方。您显示的代码不是问题。
  • 在“实习生”之前我只能看到禁用的调试宏。我把我做的所有调试步骤都报告了,所以中间没有执行其他代码。
  • 为什么要通过.运算符,并通过 -> 运算符 isClosed?这个问题是由于 shared_ptr 的一些时髦行为造成的,还是仅仅是这个问题中的一个错字?
  • 您是否在整个程序中运行了valgrind?可能存在与 MySQL 没有直接关系的内存泄漏(或溢出),只是触发了 MySQL 连接器中的 SIGSEGV...
  • @James:因为reset()shared_ptr类的成员函数,而isClosed()sql::Connection的成员函数,共享指针指向。

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


【解决方案1】:

要么您的连接被删除,要么您的内存损坏。使用 valgrind 寻找答案

【讨论】:

    猜你喜欢
    • 2019-09-10
    • 2021-08-31
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2012-11-14
    • 2014-07-16
    相关资源
    最近更新 更多