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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Неуловимая ошибка ведущая к краху программы  (Прочитано 6517 раз)
catprog
Гость
« : Май 15, 2012, 14:57 »

Есть не маленькая прога, очень долго работает и по неведомым причинам через несколько часов работы например, может возникнуть ошибка "segmentation fault". В связи с такой редкой случайностью отладить очень трудно. Подскажите пожалуйста, что можно прописать в код, чтобы если где либо возникнет эта ошибка, случился перехват, который определит место в коде и запишет его в лог.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Май 15, 2012, 15:08 »

пускать через debugger и ловить backtrace
Записан
catprog
Гость
« Ответ #2 : Май 15, 2012, 15:12 »

пускать через debugger и ловить backtrace
Допустим поймал эту ошибку дебагером, как мне пройтись по коду в обратном порядке?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Май 15, 2012, 15:29 »

А зачем в обратном? Тебе нужен стек вызовов.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
catprog
Гость
« Ответ #4 : Май 15, 2012, 18:09 »

А зачем в обратном? Тебе нужен стек вызовов.
Ну стек такой есть. Полезно конечно, но было бы удобно иметь возможность перед возникновением ошибки, записать в лог все что можно.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Май 15, 2012, 18:14 »

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

segfault - это фатальный сигнал, можешь пробовать его перехватывать через signal(2) и записывать какие-то данный в логи, но это легко может не работать. Если стек есть, то он должен натолкнуть на мысли.
« Последнее редактирование: Май 15, 2012, 18:36 от Alex Custov » Записан
V1KT0P
Гость
« Ответ #6 : Май 15, 2012, 18:41 »

пускать через debugger и ловить backtrace
Допустим поймал эту ошибку дебагером, как мне пройтись по коду в обратном порядке?
Посмотри настройки или плагины для valgrind, должна быть возможность записи вызовов всех функций. Но он только под Linux.
Записан
catprog
Гость
« Ответ #7 : Май 15, 2012, 20:28 »

segfault - это фатальный сигнал, можешь пробовать его перехватывать через signal(2) и записывать какие-то данный в логи, но это легко может не работать. Если стек есть, то он должен натолкнуть на мысли.

А какой объект выдает этот сигнал?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #8 : Май 15, 2012, 20:46 »

А какой объект выдает этот сигнал?

Это сигнал от ядра. man 7 signal
Записан
catprog
Гость
« Ответ #9 : Май 31, 2012, 17:53 »

А какой объект выдает этот сигнал?

Это сигнал от ядра. man 7 signal

А можно пример кода по ловле этого сигнала с использованием этой функции:

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection )   [static]

а то чтото я нахожу постороннее по этому запросу.
Записан
mutineer
Гость
« Ответ #10 : Май 31, 2012, 17:56 »

А какой объект выдает этот сигнал?

Это сигнал от ядра. man 7 signal

А можно пример кода по ловле этого сигнала с использованием этой функции:

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection )   [static]

а то чтото я нахожу постороннее по этому запросу.

Так не получится поймать - это сигнал не Qt, а операционной системы
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #11 : Май 31, 2012, 18:03 »

А можно пример кода по ловле этого сигнала с использованием этой функции:

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection )   [static]

а то чтото я нахожу постороннее по этому запросу.

Это сигнал от ядра приложению, к Qt это не имеет никакого отношения. Читай man 7 signal и man 2 signal.
Записан
DmitryM
Гость
« Ответ #12 : Май 31, 2012, 22:03 »

В Linux и Windows есть возможность сделать дамп памяти в момент краха приложения.
Далее дамп засовываем в отладчик и смотрим стек вызовов.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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