1

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 内で作業する場合の既知の問題であり、これについて私ができることはあまりないことを示しています。

4

1 に答える 1