SIGSEGV при выходе

Вопросы программирования и использования среды Lazarus.

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

SIGSEGV при выходе

Сообщение А.Н. » 04.07.2010 21:57:25

После того, как я что-то исправил в программе, при выходе, вылетает SIGSEGV почти всегда.
Иной раз, даже два раза. Мало того, что это раздражает, это ещё означает, что, вероятно, где-то есть утечка ресурсов.
Стек вызовов показывает что-то невразумительное: обращение из деструкторов компонент (MyDAC).
Не приложу ума как отловить эти ошибки.

Может, кто подскажет?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: SIGSEGV при выходе

Сообщение hinst » 04.07.2010 22:52:55

ну есть пара идей :roll: :idea:
1. сделать лог. чтобы особенно подробный вывод был при работе деструкторов. посмотреть, что за чем разрушается
2. сделать все компоненты наследниками некоего класса TGlobalComponent, который бы при создании добавлял себя, своё имя и свой ClassName в некий глобальный список. Потом по этому списку смотреть, какие объекты живут в каждый момент. Ну при разрушении он ессно должен удалять себя из списка. к моменту завершения работы смотреть, как с ними обстоят дела
Также если у вас нити-потоки в приложении, можно их также хранить в глобальном списке. чтобы при создании они добавлялись. и смотреть, какие на момент выхода из проги работают, какие стоят, какие разрушены и т.п.
я сам часто сталкивался с такой лажей. испробовал сам эти методы. правда, мои проги всё равно лагали после того, как я ввёл такой "контроль". но намного меньше. особенно если вводил его сразу, как только начинал писать прогу, а не когда она начинала лагать
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: SIGSEGV при выходе

Сообщение А.Н. » 04.07.2010 23:16:02

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

Ох, тяжко. Но, похоже, единственный вариант. К тому же, всё-равно, надо лог делать.
Если к примеру, класс компонента и строку запихнуть, то возможно будет определить место до которого не дошло.

2. сделать все компоненты наследниками некоего класса TGlobalComponent, который бы при создании добавлял себя, своё имя и свой ClassName в некий глобальный список.

:shock: Самоубийственно. Причём, segfault, наверняка, при разрушении форм... Где-то в деструкторе что-то не разрушается. Потом, может, это пытается разрушиться где-то ещё, но т.к. форма уже была разрушена...
В общем, компонент много и они разные...

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

О! Вспомнил. В CBuilder6 был очень удобный инструмент - "CodeGuard". Может, есть подобное для lazarus?

особенно если вводил его сразу, как только начинал писать прогу, а не когда она начинала лагать

Поздно пить Боржоми. :(

Спасибо.
Ещё есть предложения?

Добавлено спустя 1 час 23 минуты 1 секунду:
Как получить:
1.) Имя метода в котором выполняется код;
2.) Строку в файле исходнике (в случае прилинковки отладочной информации);
чтобы записать в лог?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: SIGSEGV при выходе

Сообщение Иван Шихалев » 05.07.2010 01:47:01

2) Я бы попробовал модуль LineInfo при включенной опции -gl.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 238

Рейтинг@Mail.ru