【问题标题】:mysql_ping causes SIGSEGVmysql_ping 导致 SIGSEGV
【发布时间】:2017-11-09 02:58:15
【问题描述】:

我使用 c++ 和 mysql++ 库。我在每个线程上有单独的 mysqlpp::Connection 对象。所有 mysqlpp 选项都是默认的(ReconnectOption 被禁用)。每个线程都与 MariaDB 服务器保持持久连接。在一系列 SQL 查询之前,我进行以下检查:

try
{
    if (!connection.ping()) connection.connect(db_cfg.name.c_str(),
                                               db_cfg.server.c_str(),
                                               db_cfg.user.c_str(),
                                               db_cfg.password.c_str(),
                                               db_cfg.port);
}

此代码很少产生以下 SIGSEGV:

#0  0x00007fe0a625eb46 in ?? () from /usr/lib/x86_64-linux-  gnu/libmysqlclient.so.20
#1  0x00007fe0a6251b26 in mysql_ping () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20
#2  0x00007fe0ab6773b1 in mysqlpp::Connection::ping() () from /usr/lib/libmysqlpp.so.3

我试图通过在无限循环中运行带有 ping/connect 调用的测试程序来重现此错误。在执行期间,我手动重新启动了 MariaDB 服务器。但是我没有成功复制。 您有任何解决方法的想法吗?谢谢。

操作系统:Ubuntu 64 位

【问题讨论】:

  • 什么是connectionMYSQL 指针是否有效? MYSQL 对象是否在线程之间共享?没有数据竞赛?
  • 我在 libmysqlclient 上使用 mysqlpp 库。每个线程都有自己的 mysqlpp::connection。所以Mysql对象是不共享的。
  • 当我在谷歌上查找问题时,我发现了很多错误报告,报告了与您类似的问题:[1][2][3] 等等。您使用的是哪个版本,也许它已被修复?尝试用调试信息编译和链接你的程序,这样你就会看到它崩溃的行。另一种选择是编写一个核心文件并对其进行调试。您也可以尝试运行valgrind --track-origins=yes program,valgrind 可以为您指明正确的方向。

标签: c++ mysql++ libmysql


【解决方案1】:

mysqlpp++ 是使用 libmariadbclient 而不是 libmysqldbclient 重建的。它解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2016-06-06
    • 2014-10-22
    • 2010-11-29
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    相关资源
    最近更新 更多