2011-12-21 51 views
0

我有一个C程序,维护一个持久的MySQL连接,版本5.1.46。如果我重新启动mysql的程序运行时,我得到一个双免费或损坏错误这样:MySQL的重新启动导致双免费或损坏使用MySQL的C API

# /etc/init.d/mysql restart 
Shutting down MySQL........ [ OK ] 
Starting MySQL.*** glibc detected *** /home/user/a.out: double free or corruption (!prev): 0x000000000b64dd00 *** 
======= Backtrace: ========= 
/lib64/libc.so.6[0x3739471634] 

我期待的连接,自动重新连接,因为我已经设置了MYSQL_OPT_RECONNECT选项,并没有明确关闭此连接尚未。另外,我正在执行的查询不是一个char *,我不小心将其设置为NULL或解除分配,它是一个常量,双引号字符串。

下面是从生成的核心文件中的几行字在gdb

#11 0x000000000044ed71 in mysql_send_query (mysql=0x41966aa0, query=0x41966100 "SELECT count (*) from TableA", length=27) at client.c:2894 
#12 0x000000000044edd9 in mysql_real_query (mysql=0x602a, query=0x602d <Address 0x602d out of bounds>, length=6) at client.c:2905 
#13 0x000000000042b42f in do_query (conn=0x41966aa0, msg=0x41966100 "SELECT count(*) from TableA") at dosql.cpp:20 

任何想法,为什么这可能是发生?

+0

您在服务器端运行的MySQL版本是什么,以及您在客户端中使用了哪种版本的C API? – ObscureRobot 2011-12-21 19:10:08

+0

我正在使用的系统有MySQL服务器5.1.46,我使用5.1.46 MySQL-devel软件包,我相信它包含C API。 – 2011-12-21 21:23:09

回答

0

任何想法,为什么这可能会发生?

由于MySQL中的错误。

您可以尝试更新到更高版本的包,并查看问题是否消失。

或者,在Valgrind下运行您的客户端程序,它会以可用于修复它的方式报告错误。特别是,它会报告在分配内存它已被释放

  • 堆栈跟踪,其中双自由正在发生
  • 堆栈跟踪

    • 堆栈跟踪信息(应与您的GDB的堆栈跟踪)

    鉴于这些信息,您可以向MySQL开发人员报告错误,并希望它最终得到修复。