我正在尝试对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中工作时这是一个已知的问题,对此我无能为力。
最佳答案
通过不为每个循环迭代打开连接(无论如何还是有问题的),而对所有循环迭代使用一个连接,可能会避免打开文件的限制(错误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 Segfault,间歇性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10425326/