gpt4 book ai didi

c++ - MySQL 段错误,间歇性

转载 作者:行者123 更新时间:2023-11-29 07:00:31 27 4
gpt4 key购买 nike

我正在尝试对 MySQL 5.5 数据库执行一系列检查/插入操作,但我经常遇到间歇性的 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之后建议,在 connect=mysql_init(NULL) 之后,我能够看到这是错误 23(由 mysql_error(connect) 返回)。

这让我找到了一些资源,最明显的是,this one .这表示这是在 Windows 中工作时的已知问题,对此我无能为力。

最佳答案

您可以通过不为每个循环迭代打开连接(无论如何这是有问题的)来绕过打开文件限制(错误 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 )。

关于c++ - MySQL 段错误,间歇性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10425326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com