Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Программа падает при работе с pthreads & mysql


Автор: M4D 23.4.2006, 11:48
Здравствуйте!
Пишу программу, которая должна работать в многопоточном режиме, и каждый поток
имеет собственное соединение с MySQL. Как было сказано в мане, в начале программы
делаю my_init(); а в созданном потоке в начале mysql_thread_init(); и mysql_thread_end();
перед pthread_exit();
Но при вызове mysql_real_connect() прога падает - "Segmentation fault (core dumped)"
Ось - FreeBSD 6, компилирую так:

gcc serv.c -I/usr/local/include/mysql -L/usr/local/lib/mysql -lpthread -lmysqlclient_r -o serv

Компилится нормально, без ошибок. Но прога падет при попытке коннекта с MySQL smile В чем дело? 

Автор: kirjanov 23.4.2006, 20:57
желательно привети исходный код.... 

Автор: M4D 23.4.2006, 21:58
Приведу детали:

Код

void* thread(void* thread)
{
         MYSQL mysql;

         mysql_thread_init();

         mysql_init(&mysql);
         printf("1\n");       // Выводит
         mysql_real_connect(&mysql, NULL, "root", "", "test", 0, NULL, 0);
         printf("2\n");       // Тут падает

    mysql_thread_end();
    pthread_exit(NULL);
}


main(int argc, char* argv[])
{
         pthread_t thread;    
         my_init();
         pthread_create(&thread, NULL, (void*(*)(void*))thread, NULL);
         sleep(100000);
}


падает smile 

Автор: bilbobagginz 24.4.2006, 01:13
результат всех функций нужно тестировать на предмет ошибок. либо ты тестируешь результаты функций в коде, либо твоя программа вылетает и ты не знаешь почему.
каждая из функций mysql могла упасть. и каждую ф-ю не типа void, нужно проверять на результат.
если она возвращает плохой результат, стоит протестировать переменную errno, или какую внутреннюю свою. посмотри пример использования:
http://docsrv.caldera.com:8457/cgi-bin/info2html?(mysql.info.gz)mysql_real_connect


пока.  

Автор: M4D 24.4.2006, 17:47
Я бы протестировал на ошибки, да вот она падает видимо в недрах mysql_real_connect(), т.к. printf("2\n"); не вызывается. Про возвращаемые ошибки я конечно же знаю ;) меня интересовал вопрос - почему же она падает? smile 

Автор: kirjanov 25.4.2006, 13:59
M4D, 

так ты все же посмотри, что возвращает mysql_real_connect()....
и тогда 
Цитата
почему же она падает?
 будет  ясно

 

Автор: bilbobagginz 25.4.2006, 18:15
используй strace. 

Автор: M4D 25.4.2006, 22:35
Вобщем проблема решилась! Очень, очень странно, но:
была у меня в теле проги объявлена структура 
typedef struct {
... } my_struct;

my_struct struc1;

Так вот, когда она была, прога и падала) а когда я ее удалил, все стало нормально работать )) мистика какая-то... перенес все данные из структуры в виде глобальных переменных = все пашет smile 
спасибо всем, кто откликнулся!  smile  

Автор: bilbobagginz 27.4.2006, 12:35
может быть проблема в том что если внутри блока потока ты объявляешь переменную, 
то она локальна для данного потока. и когда ты пытался обращаться из одного потока на адрес этой переменной другого, то получал совершенно правильный SEGFAULT.

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)