Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2017.12.17;
Скачать: [xml.tar.bz2];

Вниз

Как вычленить ошибку в программе.   Найти похожие ветки 

 
vegarulez   (2015-12-29 18:45) [0]

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


 
sniknik ©   (2015-12-29 19:01) [1]

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

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

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

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

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


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

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

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


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

https://www.eurekalog.com/


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

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


 
sniknik ©   (2015-12-29 22:35) [5]

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


 
Rouse_ ©   (2015-12-29 23:25) [6]

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


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


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

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


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

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


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

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

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


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


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

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


 
KSergey ©   (2016-01-09 15:37) [11]

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

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


 
KSergey ©   (2016-01-09 15:40) [12]

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

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


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


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

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

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


 
virex(home) ©   (2016-01-15 07:29) [14]

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2017.12.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.001 c
3-1316003811
PrincNochi
2011-09-14 16:36
2017.12.17
PopupMenu заполняемый из БД Access


2-1452638674
mybass
2016-01-13 01:44
2017.12.17
[dcc32 Error] E2036 Variable required


2-1451403906
vegarulez
2015-12-29 18:45
2017.12.17
Как вычленить ошибку в программе.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский