Russian Qt Forum
Сентябрь 28, 2024, 14:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4] 5 6   Вниз
  Печать  
Автор Тема: Странная ошибка SIG SEGV  (Прочитано 35278 раз)
Bepec
Гость
« Ответ #45 : Март 29, 2012, 20:49 »

Утечка - течёт память. Программа подскальзывается, но работает.

Порча памяти - программа летит с обрыва в армагеддец ядерный.

Валгринд и прочие дебаггеры поддерживают программу. Помогают, так сказать, ей не умирать.

Под той же студией или Creator'ом порча может быть незаметной. Ей не происходит, ибо IDE поддерживает программу. А вот запускаешь в релизе и усё. Через секунду/час/месяц/год ваша программа разорвёт чьи либо планы своим Exception.

PS Вот ни за что, ни за что не поверю, что с незакомменченным unlock'ом ваша программа работала. Это противоречит всему, что является аксиомами про мутексы Подмигивающий
Записан
vbi
Гость
« Ответ #46 : Март 30, 2012, 01:14 »

Может и так. Я релиз давно уже не собирал, по крайней мере с тех пор как мютекс поставил... Вот почему бектрейс не показывает в каком именно месте программы вызывается ексцепшн? Потому что это не в коде программы а в коде самого QT (кстате я ставил QT с исходниками, но вместо исходника в бектрейсе отображается почему-то дизасемблер бинарника..) какой-то евент - событие от QNetworkAccessManager в котором уже что-то нарушено. Как я мог испортить что - то в QNetworkAccessManager. Я ставил проверку на передаваемую ссылку и отбрасывал плохие ссылки, но всеравно ошибку получаю.
Записан
V1KT0P
Гость
« Ответ #47 : Март 30, 2012, 01:22 »

Может и так. Я релиз давно уже не собирал, по крайней мере с тех пор как мютекс поставил... Вот почему бектрейс не показывает в каком именно месте программы вызывается ексцепшн? Потому что это не в коде программы а в коде самого QT (кстате я ставил QT с исходниками, но вместо исходника в бектрейсе отображается почему-то дизасемблер бинарника..) какой-то евент - событие от QNetworkAccessManager в котором уже что-то нарушено. Как я мог испортить что - то в QNetworkAccessManager. Я ставил проверку на передаваемую ссылку и отбрасывал плохие ссылки, но всеравно ошибку получаю.
Тебе же сказали ты портишь память, и эта память может оказаться чем угодно. В данном случае портится память в QNetworkAccessManager вроде как. У меня вообще веселье, прога падает а в бэктрейсе всего одна строчка и та указывает на кукую-то функцию в msvcr =). Если не найду где ошибка придется отказаться от многопоточности =(.
Записан
Bepec
Гость
« Ответ #48 : Март 30, 2012, 07:07 »

Виктор я бы вам посоветовал разобрать ваши потоки. По отдельности. На тестовом проекте.

Мне лично помогало, когда задаёшь все необходимые для работы параметры и тестируешь. Так за день/пару часов вы уже локализуете поток, который совершает порчу.

А далее уже карандаш, бумажку (ну или в моём случае отладчик) и погнал разбирать.

А не показывает тебе сырцы неизвестно почему. Я ведь даже незнаю какая у тебя IDE?
Записан
mutineer
Гость
« Ответ #49 : Март 30, 2012, 10:09 »

Не показывает сорцы скорее всего потому, что для запуска используются не дебажные версии Qt либ
Записан
V1KT0P
Гость
« Ответ #50 : Март 30, 2012, 12:53 »

Виктор я бы вам посоветовал разобрать ваши потоки. По отдельности. На тестовом проекте.

Мне лично помогало, когда задаёшь все необходимые для работы параметры и тестируешь. Так за день/пару часов вы уже локализуете поток, который совершает порчу.

А далее уже карандаш, бумажку (ну или в моём случае отладчик) и погнал разбирать.

А не показывает тебе сырцы неизвестно почему. Я ведь даже незнаю какая у тебя IDE?
QtCreator, Qt не используется. Использую boost и boost::asio. Все потоки синхронизируются через boost::asio::strand. Добавляются потоки, которые сразу же выполняют boost::asio::io_service::run. Либы я точно дебажные добавляю с приставкой -d. При одном потоке все нормально, при двух и более падает =(.
Записан
Bepec
Гость
« Ответ #51 : Март 30, 2012, 14:09 »

Попробуй по одному потоку потестить Подмигивающий
Записан
vbi
Гость
« Ответ #52 : Апрель 01, 2012, 20:42 »

Заметил странную особенность. Как Вы заметили этот фрагмент программы, который я выложил парсит каталог DMOZ. Но если его переписать таким образом, чтоб он парсил другой сайт (например Яндекс) - данная ошибка ни разу не наблюдалась. По крайней мере количество возвращенных результатов было около 150 000 и было остановлено вручную.
Записан
Bepec
Гость
« Ответ #53 : Апрель 02, 2012, 07:07 »

Ты портишь память в программе. В любом месте. Возможно даже в потоке Улыбающийся А может быть в конструкторах. Памяти это без разницы Улыбающийся

PS короче - мб у тебя порча там и была, но это уже ты решай Улыбающийся
Записан
V1KT0P
Гость
« Ответ #54 : Апрель 02, 2012, 08:34 »

Виктор я бы вам посоветовал разобрать ваши потоки. По отдельности. На тестовом проекте.

Мне лично помогало, когда задаёшь все необходимые для работы параметры и тестируешь. Так за день/пару часов вы уже локализуете поток, который совершает порчу.
Ахаха, я локализовал порчу. Портит все вот эта функция:
Код
C++ (Qt)
void Connection::generateString(string *generateString)
{
   stringstream generatedString;
   time_facet *pfacet = new time_facet("%d-%b-%Y %H:%M:%S");
   generatedString.imbue(locale(locale::classic(), pfacet));
   generatedString << setprecision(8) << "INSERT INTO SOME_TABLE VALUES ( 0, " << static_cast<uint32_t>(m_session.id) << ", '"
                   << boost::posix_time::from_time_t(m_session.timeStamp) << "', "
                   << static_cast<uint32_t>(m_session.someValue) << ");";
   *generateString = generatedString.str();
}
Если в ней прописать:
Код
C++ (Qt)
*generateString = "Some text";
То все успешно работает. А так глючит. Сразу скажу что кушает эту строку IBASE. Так вот в многопоточности возникает какой-то глюк. Что я делаю не так?
Вот что в этой функции может портить память?!
Записан
gogi
Гость
« Ответ #55 : Апрель 02, 2012, 14:39 »

Виктор я бы вам посоветовал разобрать ваши потоки. По отдельности. На тестовом проекте.

Мне лично помогало, когда задаёшь все необходимые для работы параметры и тестируешь. Так за день/пару часов вы уже локализуете поток, который совершает порчу.
Ахаха, я локализовал порчу. Портит все вот эта функция:
Код
C++ (Qt)
void Connection::generateString(string *generateString)
{
   stringstream generatedString;
   time_facet *pfacet = new time_facet("%d-%b-%Y %H:%M:%S");
   generatedString.imbue(locale(locale::classic(), pfacet));
   generatedString << setprecision(8) << "INSERT INTO SOME_TABLE VALUES ( 0, " << static_cast<uint32_t>(m_session.id) << ", '"
                   << boost::posix_time::from_time_t(m_session.timeStamp) << "', "
                   << static_cast<uint32_t>(m_session.someValue) << ");";
   *generateString = generatedString.str();
}
Если в ней прописать:
Код
C++ (Qt)
*generateString = "Some text";
То все успешно работает. А так глючит. Сразу скажу что кушает эту строку IBASE. Так вот в многопоточности возникает какой-то глюк. Что я делаю не так?
Вот что в этой функции может портить память?!

Вангую, что у тебя наружу (в *generateString) передаётся локальный указатель (generatedString.str()).
Записан
V1KT0P
Гость
« Ответ #56 : Апрель 02, 2012, 14:47 »

Виктор я бы вам посоветовал разобрать ваши потоки. По отдельности. На тестовом проекте.

Мне лично помогало, когда задаёшь все необходимые для работы параметры и тестируешь. Так за день/пару часов вы уже локализуете поток, который совершает порчу.
Ахаха, я локализовал порчу. Портит все вот эта функция:
Код
C++ (Qt)
void Connection::generateString(string *generateString)
{
   stringstream generatedString;
   time_facet *pfacet = new time_facet("%d-%b-%Y %H:%M:%S");
   generatedString.imbue(locale(locale::classic(), pfacet));
   generatedString << setprecision(8) << "INSERT INTO SOME_TABLE VALUES ( 0, " << static_cast<uint32_t>(m_session.id) << ", '"
                   << boost::posix_time::from_time_t(m_session.timeStamp) << "', "
                   << static_cast<uint32_t>(m_session.someValue) << ");";
   *generateString = generatedString.str();
}
Если в ней прописать:
Код
C++ (Qt)
*generateString = "Some text";
То все успешно работает. А так глючит. Сразу скажу что кушает эту строку IBASE. Так вот в многопоточности возникает какой-то глюк. Что я делаю не так?
Вот что в этой функции может портить память?!

Вангую, что у тебя наружу (в *generateString) передаётся локальный указатель (generatedString.str()).
Вообще-то там просто копируется текст а не указатель.
А причина была в
Код
C++ (Qt)
boost::posix_time::from_time_t(m_session.timeStamp)
Заменил на:
Код
C++ (Qt)
sprintf(timestamp, "%02d-%s-%04d %02d:%02d:%02d", time->tm_mday, mon[time->tm_mon], 1900+time->tm_year,
           time->tm_hour, time->tm_min, time->tm_sec);
И все заработало.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #57 : Апрель 02, 2012, 15:43 »

То все успешно работает. А так глючит. Сразу скажу что кушает эту строку IBASE. Так вот в многопоточности возникает какой-то глюк. Что я делаю не так?
Вот что в этой функции может портить память?!

Если портится память, то программа может падать на совершенно нормальных участках и через много времени от того момента, как память испортилась.
Записан
V1KT0P
Гость
« Ответ #58 : Апрель 02, 2012, 16:12 »

То все успешно работает. А так глючит. Сразу скажу что кушает эту строку IBASE. Так вот в многопоточности возникает какой-то глюк. Что я делаю не так?
Вот что в этой функции может портить память?!

Если портится память, то программа может падать на совершенно нормальных участках и через много времени от того момента, как память испортилась.
Я уже много раз проверял перепроверял. Строку не куда не передавал, просто генерировал, при чес оставил только:
Код
C++ (Qt)
boost::posix_time::from_time_t(m_session.timeStamp)
Так вот при одном потоке эта строчка работает нормально, при нескольких потоках падает. Я уже начинаю бояться использовать все возможности буста, ибо это меня огорчает. Если память и портит то только эта строка, при использовании ее в stringstream.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #59 : Апрель 02, 2012, 17:19 »

Я уже много раз проверял перепроверял. Строку не куда не передавал, просто генерировал, при чес оставил только:
Код
C++ (Qt)
boost::posix_time::from_time_t(m_session.timeStamp)

У меня программа стабильно вылетала на создании контекстного меню, позже оказалось, что я два раза удалял указатель в совершенно другом месте.
Записан
Страниц: 1 2 3 [4] 5 6   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.293 секунд. Запросов: 22.