MySQL 5.5 データベースへの一連のチェック/挿入を実行しようとしていますが、SIGSEGV エラーに関する頻繁かつ断続的な問題が発生しています。多くのクエリが実行される過程で、SELECT
ステートメントは問題なく実行されます。ただし、一定の時間または実行されたクエリの数 (数千のチェック、場合によっては 1 または 2、場合によってはまったくチェックされず、プログラムが正常に終了する) の後、不可解に segfault が発生します...
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/segfault 関連のフォーラム/Q+A トピック/スレッドはたくさんあります)。これは .dll 自体で発生しているように見えるので、どうすれば修正できますか?
問題が発生したり消えたりする理由を誰か説明できますか?
MySQL の再インストールはまだ試みていません。私がしなければならないなら、私はしなければなりません。
質問の詳細や関連するコードが不足している場合は、お知らせください。追加します。
Christian.K のアドバイスに従った後mysql_error(connect)
、これがconnect=mysql_init(NULL)
.
これにより、いくつかのリソースにたどり着きました。最も明確なのは、これです。これは、これが Windows 内で作業する場合の既知の問題であり、これについて私ができることはあまりないことを示しています。