Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа падает при работе с pthreads & mysql 
:(
    Опции темы
M4D
Дата 23.4.2006, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 4.6.2005

Репутация: нет
Всего: нет



Здравствуйте!
Пишу программу, которая должна работать в многопоточном режиме, и каждый поток
имеет собственное соединение с 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 В чем дело? 
PM MAIL   Вверх
kirjanov
Дата 23.4.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2006
Где: Dark wood of erro r

Репутация: 3
Всего: 15



желательно привети исходный код.... 
PM MAIL   Вверх
M4D
Дата 23.4.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 4.6.2005

Репутация: нет
Всего: нет



Приведу детали:

Код

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 
PM MAIL   Вверх
bilbobagginz
Дата 24.4.2006, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



результат всех функций нужно тестировать на предмет ошибок. либо ты тестируешь результаты функций в коде, либо твоя программа вылетает и ты не знаешь почему.
каждая из функций mysql могла упасть. и каждую ф-ю не типа void, нужно проверять на результат.
если она возвращает плохой результат, стоит протестировать переменную errno, или какую внутреннюю свою. посмотри пример использования:
http://docsrv.caldera.com:8457/cgi-bin/inf...ql_real_connect


пока.  

Это сообщение отредактировал(а) bilbobagginz - 24.4.2006, 01:15


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
M4D
Дата 24.4.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 4.6.2005

Репутация: нет
Всего: нет



Я бы протестировал на ошибки, да вот она падает видимо в недрах mysql_real_connect(), т.к. printf("2\n"); не вызывается. Про возвращаемые ошибки я конечно же знаю ;) меня интересовал вопрос - почему же она падает? smile 
PM MAIL   Вверх
kirjanov
Дата 25.4.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2006
Где: Dark wood of erro r

Репутация: 3
Всего: 15



M4D

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

 
PM MAIL   Вверх
bilbobagginz
Дата 25.4.2006, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



используй strace. 

Это сообщение отредактировал(а) bilbobagginz - 25.4.2006, 18:22


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
M4D
Дата 25.4.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 4.6.2005

Репутация: нет
Всего: нет



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

my_struct struc1;

Так вот, когда она была, прога и падала) а когда я ее удалил, все стало нормально работать )) мистика какая-то... перенес все данные из структуры в виде глобальных переменных = все пашет smile 
спасибо всем, кто откликнулся!  smile  
PM MAIL   Вверх
bilbobagginz
Дата 27.4.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



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

 


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.