我想通過一系列的檢查/插入到MySQL 5.5分貝,但我有SIGSEGV錯誤頻繁但間歇性的問題。在執行許多查詢的過程中,SELECT
語句運行良好。但是,(在程序正常退出有時數千的檢查,有時1或2,有時甚至根本沒有和)後的一段可變量或執行的查詢號碼,我莫名其妙地得到了段錯誤...MySQL段錯誤,間歇
Program received signal SIGSEGV, Segmentation fault.
0x100188a8 in mysql_send_query() from K:\Programming\C\Test\libmysql.dll
(gdb) bt full
#0 0x100188a8 in mysql_send_query() from K:\Programming\C\Test\libmysql.dll
No symbol table info available.
#1 0x100188e5 in mysql_real_query() from K:\Programming\C\Test\libmysql.dll
No symbol table info available.
#2 0x00000000 in ??()
No symbol table info available.
(gdb)
這是我的重降低代碼:
int main() {
for (int i = 0; i < 5000; i++) {
int iNewX = GenerateRandomInt(1, 50);
int iNewY = GenerateRandomInt(1, 50);
std::string str = "SELECT * FROM Resources WHERE XPOS = ";
str = str +
StatToString(iNewX) + " AND YPOS = " +
StatToString(iNewY) + ";";
const char * Query = str.c_str();
MYSQL *connect;
connect=mysql_init(NULL);
connect=mysql_real_connect(connect,SERVER,USER,PASSWORD,DATABASE,0,NULL,0);
// Print SQL statment for debugging only...
// This appears to always be good, even in the case of the segfault.
std::cout << Query << std::endl;
if (mysql_query(connect, Query)) {
// Supposed to log an error; I don't get this far...
// This does work when I intentionally break the statement.
std::cout << printf("Failed to SELECT, Error: %s", mysql_error(connect));
std::cout << printf("Query: %s", Query) << std::endl;
mysql_close(connect);
return 0;
}
mysql_close(connect);
}
return 1;
}
我已經在真正符合我所會在這裏(雖然有很多的MySQL /段錯誤相關的論壇/ Q + A的話題的情況下,在網上搜索不成功/線程)。由於這似乎是在.dll本身發生的,我該如何解決這個問題?
任何人都可以解釋爲什麼這個問題似乎來來去去?
我還沒有嘗試重新安裝MySQL,因爲這可能會是一個非常令人頭疼的問題,我寧願避免。如果我必須,那麼我必須。
如果我錯過了我的問題或任何相關代碼的任何細節,請讓我知道,我會補充。
以下Christian.K's意見後,我能看到,這是錯誤23(由mysql_error(connect)
返回)connect=mysql_init(NULL)
之後。
這引出了我的一些資源,最清楚的是,this one。這就是說,在Windows中工作時這是一個知之甚少的問題,對此我也無能爲力。
幾件事情:檢查'mysql_init'的返回值,尤其是'mysql_real_connect'。如果出現錯誤,稍後返回「NULL」。我不是MySQL的專家,但也許'mysql_query'不喜歡傳遞一個空指針作爲第一個參數。另外,'cout << printf'有點奇怪。你真的想首先打印消息(printf),然後輸出它的字符數(這是printf的返回值) - 儘管這不應該是'SIGSEGV'。 –
@ Christian.K其實,這個錯誤陷阱是從一個在線教程中挑選出來的,但是感謝這些信息。你會在這些行後面提示「if(connect!= NULL){...}」嗎?即便如此,我仍然不明白爲什麼它在我遇到任何問題之前多次工作。 – Gaffi
是的,這是我的建議。這可能是因爲連接有時會失敗(無論什麼原因,也許'mysql_error()'在這裏也有幫助),然後'NULL'被返回並傳遞給'mysql_query'。但是,處理這個錯誤是一種很好的風格,可能有助於診斷這裏的根本原因。除此之外,我沒有MySQL的知識;-) –