LINUX.ORG.RU

Segmentation fault (C & Mysql)


0

0

Здраствуйте! Подскажите пожалуйста что за ошибка и как лечится! Вылетает во время работы. Прога конектится и делает запрос БД, выполняет mysql_store_result() и mysql_num_rows А после эта ошибка. Далее прога должна в цикле выполнить mysql_fetch_row() и вывести результат,ну а после mysql_free_result и mysql_close. Хех. А вот исходник:

#ifdef HAVE_CONFIG_H #include <config.h> #endif

#include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> #include <sys/time.h> #include <errno.h>

int main(int argc, char *argv[]) { MYSQL_RES *res; MYSQL_ROW row; MYSQL *connection,mysql; int state; mysql_init(&mysql); printf("Init\n"); connection=mysql_real_connect(&mysql,"localhost","root", "hex","mysql",0,"/var/lib/mysql/mysql.sock",0); if(connection==NULL){ perror( mysql_error(&mysql)); exit(errno); } printf("Connected\n"); state=mysql_query(connection,"Select host,user,password from user;"); if (state!=0){ perror(mysql_error(connection)); exit(errno); } if(state!=0){ perror(mysql_error(connection)); exit; } res= mysql_store_result(connection); printf("Strok:%d\n",mysql_num_rows(res)); while((row=mysql_fetch_row(res))!=NULL){ printf("host:%s , name:%s ,pwd:%s",(row[0] ? row[0]:"NULL"),(row[1] ? row[1]:"NULL"),(row[2] ? row[2] :"NULL")); } mysql_free_result(res); mysql_close(connection);

return EXIT_SUCCESS; }

anonymous

Re: Segmentation fault (C & Mysql)

У меня работает, но я в mysql_real_connect заменил явное указание сокета на NULL.

Возможно, что проблема в кривых данных, которые валят printf при форматировании. Для начала посмотрите, что дает выполнение запроса в mysql. Затем выкиньте вообще printf из цикла и посмотрите, исчезла ли ошибка. После этого попробуйте упростить формат printf, может быть, попробуйте вывести результаты с помощью puts и так далее.

В общем, как обычно -- упрощайте неработающий участок.

eugine_kosenko ★★★ ()
Ответ на: Re: Segmentation fault (C & Mysql) от eugine_kosenko

Re: Segmentation fault (C & Mysql)

Методом тыка и удалением кода дошел вот до такого кода:

int main(int argc, char *argv[]) { MYSQL_RES *res; MYSQL_ROW row; MYSQL *connection,mysql; int state; return EXIT_SUCCESS; }

Как бы это небыло смешно!!! Но после добавления строки: mysql_init(&mysql);

Вылетает эта мифическая ошибка. После последовал экспиримент:

printf("%d\n",mysql); mysql_init(&mysql); printf("%d\n",mysql); Вывод:

25697 0 Segmentation fault

хех. Фишка в том что ошибка вылетает не сразу, а через некоторое время или несколько операций. тоесть косяк не в проге. В тоже время прога "mysql" пользует туже библиотеку и вполне работает! Как так? и что делать?

anonymous ()
Ответ на: Re: Segmentation fault (C & Mysql) от anonymous

Re: Segmentation fault (C & Mysql)

Косяк в проге. Надо проверять то, что возвращает mysql_init(), тогда не будет никаких segfault

anonymous ()
Ответ на: Re: Segmentation fault (C & Mysql) от anonymous

Re: Segmentation fault (C & Mysql)

А что он долже возвращать?! Встретил вот такой код : if(!mysql_init(&mysql)){ /*ОШИБКА */ }

вкрутил к себе, сообщение об ошибке не вылетело! А если так : printf("%d\n",mysql_init(&mysql)); то выводит: -1073745168 free():invalid pointer 0x40183f68! Segmentation fault Как исправить данный трабл!

anonymous ()
Ответ на: Re: Segmentation fault (C & Mysql) от anonymous

Re: Segmentation fault (C & Mysql)

> А что он долже возвращать?!

http://dev.mysql.com/doc/refman/4.1/en/mysql-init.html

If mysql is a NULL pointer, the function allocates, initializes, and
returns a new object. Otherwise, the object is initialized and the
address of the object is returned. If mysql_init() allocates a new
object, it is freed when mysql_close() is called to close the
connection.

Может, сделать проще?

MYSQL *mysql;

...

mysql = mysql_init(NULL);

...

mysql_close(connection);

eugine_kosenko ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.