try except end - как узнать номер строки с ошибкой?

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

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

Ответить
Angel_19
новенький
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

try except end - как узнать номер строки с ошибкой?

Сообщение Angel_19 »

Доброго!
Платформа Windows, приложение - служба.

Для отлова ошибок использую блоки try except end - как узнать номер строки с ошибкой?
Возможно ли это?

(Пока сделал так, вставил в текст программы переменную которой присваиваю GUID и потом вывожу эту переменную в лог, и могу понять где возникла ошибка. Нет ли способа проще? Т.к. этот доп код сильно ухудшает читаемость исходного кода.)
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Может это в свойствах проекта ?
Изображение
Angel_19
новенький
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Сообщение Angel_19 »

Это все стоит, и во время отладки в IDE работает.
Я говорю про то как узнать номер строки где возникла ошибка когда приложение работает без IDE (у клиента) и этот номер строки вывести в лог.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Проще всего из обработчика исключения вызвать

Код: Выделить всё

DumpExceptionBacktrace(LogFile);

запишет в файл стек вызовов, приведший к исключению.
Angel_19
новенький
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Сообщение Angel_19 »

Пишет в лог примерно такое:
$0A21FDA4
$0046300F
$0045C0A3
$00547B44
$00538FD4
$0053857E
$00436058

Как с этим работать дальше?
И после вызова начинает грузить процессор под 100%.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Если собрано с ключом -gl, то должны выводиться номера строк и имена функций. Хотя смотря что за исключение. Для самостоятельно брошенных исключений обычно работает. Для всяких EAccessViolation - как повезет. В данном случае первый адрес явно не из программы, попытка получить для него информацию может поставить код из модуля lineinfo в такую позу, из которой он уже не выйдет.
Angel_19
новенький
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Сообщение Angel_19 »

Да, с некоторыми исключениями только адреса, а с некоторыми полная выкладка - модуль, строка и др.

Почему вот только после вызова DumpExceptionBacktrace(LogFile); программа начинает загружать процессор на 100%?

Добавлено спустя 27 минут 5 секунд:
Насчет загрузки проца на 100% это у меня косяк.
Ответить