MySQL Segfault,间歇性

时间:2012-05-03 04:53:21

标签: c++ mysql segmentation-fault

我正在尝试对MySQL 5.5 db进行一系列检查/插入,但我经常出现SIGSEGV错误的间歇性问题。在执行许多查询的过程中,SELECT语句运行得很好。然而,经过一些可变的时间或执行查询的数量(有时数千次检查,有时是1或2次,有时根本没有,程序正常退出),我莫名其妙地得到了一个段错误...

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's建议之后,我在mysql_error(connect)之后看到这是错误23(由connect=mysql_init(NULL)返回)。

这使我得到了一些资源,最清楚的是this one。这说明在Windows中工作时这是一个已知问题,而且我无能为力。

1 个答案:

答案 0 :(得分:2)

您可以通过不为每个循环迭代打开连接来解决打开文件限制(错误23)(无论如何这都是有问题的),而是对所有循环迭代使用一个连接。

结合我对错误处理的评论,以及奇怪的cout << printf使用,你得到的结果是这样的:

int main() {

    MYSQL *connect;
    connect=mysql_init(NULL);

    if (connect == NULL)
    {
       printf("Insufficient memory to initialize.\n");
       return 1;
    }

    connect=mysql_real_connect(connect,SERVER,USER,PASSWORD,DATABASE,0,NULL,0);

    if (connect == NULL)
    {
       printf("Could not connect: %s\n", mysql_error(connect);
       return 1;
    }

    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();

        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.
            printf("Failed to SELECT, Error: %s", mysql_error(connect));
            printf("Query: %s", Query);
            mysql_close(connect);

            return 1;
        }
    }

    mysql_close(connect);
    return 0;
}

请注意,我还更改了返回值。根据惯例,main()应该在成功时返回0,否则返回其他内容(主要是1)。