问题
I have the following function:
int get_tcounter(char *meterType, int *error) {
MYSQL *conn = mysql_init(NULL);
get_connection(conn, DB_HOST, DB_USER, DB_PW, DB);
MYSQL_STMT *stmt = mysql_stmt_init(conn);
if (!stmt) {
log_to_console("Init stmt failed: %s\n", mysql_error(conn));
exit(1);
}
prepare_stmt(conn, stmt, GET_TCOUNTER_SQL);
MYSQL_BIND param[1], res[1];
memset(param, 0, sizeof(param));
memset(res, 0, sizeof(res));
char *paramBuff;
int tcBuff;
my_bool isNullParam[] = {0}, isNullRes[] = {0};
paramBuff = meterType;
bind_string_param(¶m[0], strlen(meterType), paramBuff, &isNullParam[0], (unsigned long *) 0);
bind_result(&res[0], MYSQL_TYPE_LONG, (char *) &tcBuff, &isNullRes[0], (unsigned long *) 0);
execute_statement(stmt, param, res);
*error = TRUE;
int ret = 0;
if (!mysql_stmt_fetch(stmt)) {
ret = tcBuff;
*error = FALSE;
}
mysql_stmt_close(stmt);
mysql_close(conn);
return ret;
}
First time I execute the function all is working as expected, but the second time around, mysql_init line throws Segmentation Fault.
Here's the core dump:
Program terminated with signal 11, Segmentation fault.
#0 0x00007fe23ee22f08 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) down
Bottom (innermost) frame selected; you cannot go down.
(gdb) up
#1 0x00007fe23ee24536 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) up
#2 0x00007fe23ee270b5 in malloc () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) up
#3 0x00007fe23fa951d2 in my_malloc () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
(gdb) up
#4 0x00007fe23fa788df in mysql_init () from /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18
(gdb) up
#5 0x0000000000403ed4 in get_tcounter (meterType=0x24bcbd0 "M-9669-8", error=0x7fff6b57a8a8) at database/data_access.c:284
284 MYSQL *conn = mysql_init(NULL);
The strange thing is that in first call conn is 0x0 before init, but the second time it's some arbitrary 0x7fff... address.
Tied assigning NULL to conn and freeing conn before init to no avail.
回答1:
There's a good chance this is memory corruption that sets up some bad state in MySQL. Try running this under Valgrind to see if there is a double free or invalid access of some kind.
回答2:
Don't link debug library(libmysqld.lib), i test it on win10+mysql5.6 5.7+vs2017, mysql_init always return NULL or crash. You should link release library(libmysql.lib).
来源:https://stackoverflow.com/questions/12851488/mysql-initnull-segmentation-fault