Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как вычленить ошибку в программе. [D7, XP]


vegarulez ©   (2015-12-29 18:45:00) 

Всем добрейшего времени суток и с наступающим!
Мастера, подскажите как мне поступить. Есть программа, довольно объемная 9000 строк, много функций и процедур + ещё файлов-потоков тысячи на 2. (TThread)
Иногда почему-то, не совсем понятно почему и не всегда - программа сбоит. вываливает Access violation а иногда просто сама собой закрывается без каких либо сообщений. Это бывает редко но бывает  - причем на разных компах. Все под winxp. Отследить зависимость какую-то довольно сложно. Сделал файлиу логирования основных процедур - раделив процедуры на части и вставив метки с номерами - и их плюю в лог, чтобы смотреть что именно вызывает ошибку, но пока не поймал.
Вопрос можно ли как-то сделать exception всего приложения, чтобы понять какая процедура или функция вызвала данный сбой - или всё обернуть в трай кэч и писать в лог на эксцепшине? Но вопрос и нтерпретаторах - попроще вставил __line__ в пыхе например - и понял какая строка выдала сбой, а как быть в компилируемом? Также метками всё утыкать и при экцепшине смотреть какой значение было последним в метке на той или иной функции? Вообщем подскажите - как правильно это сделать укажите путь истинный )


virex(home)   (2016-01-15 07:29:00) [1]

прогнать статическим анализатором кода от Kerk'а


Rouse_   (2016-01-13 19:48:00) [2]


> KSergey ©   (09.01.16 15:37) [11]
> > правда учитывай - если у тебя протект сверху висит, то
> она
> > может ошибаться (на виртуализации)
>
> Можно эти слова расшифровать? кто на ком сверху висит?

Можно.
Протектор, анализируя твой код выдирает его из тела приложения и размещает в свою секцию в виде пикода, который виртуализируется на вшитой туда-же виртуальной машине.

Сам понимаешь, если произойдет исключение в виртуализированном коде, то ни один из адресов исключения известных Эврике (которая ориентируется на МАР файл) не будет ей известен, и тогда она включит второй режим сбора информации, на основе стека вызовов и сразу же ошибется, ибо первый-же адрес возврата уйдет в глубинуу виртуалки.
Что она там потом на выходе построит - зависит от отражения бликов от Луны, но результат будет не анализируемый.


KSergey   (2016-01-09 15:40:00) [3]

> vegarulez   (29.12.15 18:45) 
> ещё файлов-потоков тысячи на 2. (TThread)

Боюсь проблема может быть в межпоточном взаимодействии, а это всё не так просто.
Идеально бы, конечно, разобраться в логике. Хотя бы крупноблочно и понять как именно потоки взаимодействуют, как синхронизируются, где возможны разные эффекты межпоточной рассинхронизации.


KSergey   (2016-01-09 15:37:00) [4]

> правда учитывай - если у тебя протект сверху висит, то она
> может ошибаться (на виртуализации)

Можно эти слова расшифровать? кто на ком сверху висит?


Германн   (2016-01-07 01:38:00) [5]


> Лори   (04.01.16 17:52) [9]
>
> Eureka это конечно высший класс, но сможет ли ТС его осилить,
>  раз такие вопросы задаёт?
>

Зврику ТС осиливать пока не нужно. Зврика на данном этапе сама сделает максимум, чтобы ТС хоть что-то понял в своей проблеме. Если поймёт - значит молодец! Если нет - ну тогда ХЗ.


Лори   (2016-01-04 17:52:00) [6]

Eureka это конечно высший класс, но сможет ли ТС его осилить, раз такие вопросы задаёт?

Для начала - как вы пишите в лог (и что у вас вообще выступает в его качестве)? Ваш лог указывает время когда сделалась запись?
Сделайте хотя бы при входе/выходе в каждую функцию/процедуру вывод в лог её имя (можно даже с параметрами). Тогда можно будет почитать-подумать.


Игорь Шевченко   (2016-01-04 12:02:00) [7]

Программу нормально переписать не предлагать ?


Германн   (2015-12-30 01:08:00) [8]


> Вопрос можно ли как-то сделать exception всего приложения,
>  чтобы понять какая процедура или функция вызвала данный
> сбой

На всякий случай ещё раз. Можно. Но ты пока сам своими силами не сможешь это сделать! Используй уже готовые решения. Эврику ты можешь бесплатно использовать  30 дней. Решение от JEDI - сколько угодно, но там придётся покопаться ручками.


Rouse_   (2015-12-29 23:25:00) [9]

Для начала поставь еврику, правда учитывай - если у тебя протект сверху висит, то она может ошибаться (на виртуализации)


sniknik   (2015-12-29 22:35:00) [10]

> ведь адрес то разный
если программу не изменяли-пере компилировали, то адрес один
Access violation at address 0048D6C8in module 'Project1.exe'. Read of address 00000000
если все таки разный, то значит ошибок в программе несколько, и валится в разных местах. может на одном коде от копипаста.


invis_   (2015-12-29 20:43:00) [11]

http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1392
в частности п.2.2.


Германн   (2015-12-29 20:25:00) [12]

https://www.eurekalog.com/


vegarulez   (2015-12-29 19:15:00) [13]

2000 не потоков, а строк в потоках(несколько потоков). я имею ввиду что если после каждой строки ставить метку - это геморой, чтобы отлавливать её по эксцепшину, когда отвалилась та или иная процедура или функция, чтобы определить какая именно строка вызвала ошибку.

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


sniknik   (2015-12-29 19:01:00) [14]

> ещё файлов-потоков тысячи на 2. (TThread)
???
каждый открытый файл,да и поток, занимает ресурсы системы. память/дескрипторы, просто открыть(/запустить) один самый простой exe-шник (працесс/поток от системы)  больше 2500 раз не получится... (ну, давно было тестили, на 32х разрядной винде, что вроде отвечает, т.к. XP).
в общем при больших "отжорах ресурсов" система не справляется, а уж у тебя в "довольно объемная 9000 строк" программе еще и багов больше...

> логирования основных процедур
это мало, нужно все писать в try except и сохранять в логи с важной на тот момент инфой (как минимум имя процедуры).

> сделать exception всего приложения
есть в Appication, но без указания откуда пришло (не считая адреса в самой ошибке)

> а как быть в компилируемом?
адрес ошибки в пишет в ексепте. сделай по нему переход в дельфе попадешь на строчку с ошибкой (хотя тут как повезет, были ли перекомпиляции, включена ли дебаг инфо...).

> как правильно это сделать укажите путь истинный
меняй логику.


Наверх

Титульная страница Поиск, карта сайта Написать письмо