2011-12-21 61 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開發人員報告錯誤,並希望它最終得到修復。