Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Идеология репортинга ошибок


Автор: Medved 4.9.2003, 10:28
Хочу в своем приложении (используется глобальная обработка ошибок). реализовать их репортинг. Т.е. при возникновении ошибок, чтобы генерировался отчет, что за ошибка произошла (класс ошибки), ее сообщение и в каком модуле и в какой процедуре она произошла. В принципе проблем нет, за исключением того, как узнать, в какой модуле произошла ошибка и в какой процедуре, если как я уже сказал используется глобальный обработчик.

Автор: gray_k 4.9.2003, 10:36
Ну например заведи глобальную переменную и первой строкой каждого модуля или процедуры присваивай ей своё уникальное значение. А потом в обработчике ошибки смотри значение этой переменной. (мож можно как-то ещё, это я с ходу придумал smile.gif, если посидеть можно наверно придумать путь поизящней)

Автор: Vit 4.9.2003, 15:07
Вряд ли это возможно.

Автор: altarasjuk 4.9.2003, 15:57
Цитата
Вряд ли это возможно.

Vit, Не, ну уж тут ты не прав... Я тоже как то бился над подобным, но ничего не добился sad.gif , но видел готовые образцы, которые подрубаются к программе и в случае возникновения ошибки кричат даже строку! (Eureka log), не внося в код никаких своих записей. т.е. в dpr файл подрубается dcu и всё. Но она требует чтобы был включен map файл и другие фиговины. Вот ссылка на демки (~662 КБ)http://altar.fatal.ru/exe_demos.exe
Pegas, если это не комерческая штуковина, то как найдёшь ответ, то скинь плиз алгоритм. Буду очень благодарен smile.gif.

Автор: stab 4.9.2003, 18:29
в JEDI Code Library есть JclLastExceptStackListToStrings в модуле JclDebug, эта процедура как раз и реализует все выше описаное и, что не очень хорошо, требует включение map файлов, но без этого придется все ручками делать, т.е. заводить таблицу адресов процедур..., что, в принципе, равносильно map файлу smile.gif

Автор: Medved 4.9.2003, 18:51
Спасибо.

Автор: x77 4.9.2003, 20:01
да, subj. достаточно забавен. с модулем, кстати, елементарно: можно повесить TApplicationEvents и написать
Код

procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
 E: Exception);
begin
 ShowMessage (e.Message + ' in ' + Sender.ClassName + ' at ' + IntToHex (integer (ExceptAddr), 8));
end;

но вот по адресу выцепить метод - задачка нетривиальная. стандартная рутина sysutils.MethodName (ExceptAddr) вернёт пусто, если метод не является published. причём я крупно подозреваю, что это не единственный подводный камень. в большинстве проектов, которые я видел обработка происходит аналогично тому, как сказал gray_k: исключительная ситуация возбуждается руками в блоке try..except с формированием мессага нужного вида. но вот глобально... типа, кинул компонент на форму - и вот оно, щасьте... - это действительно интересно smile.gif

Автор: Medved 5.9.2003, 05:57
Цитата(x77 @ 4.9.2003, 23:01)
типа, кинул компонент на форму - и вот оно, щасьте... - это действительно интересно


Да никто так и не собирается делать...... вы бы вопрос еще раз внимательно почитали.....

Автор: x77 5.9.2003, 09:07
Pegas, я прочитал внимательно. суть в том, чтобы вся логика обработки ошибок была сосредоточена в одном месте, будт то dcu, будь то компонент на форме. и может она быть самой разной, мессага на экран или запись в лог. не придирайтесь smile.gif

Автор: Medved 5.9.2003, 09:10
Ок! Будем жить дружно!

Автор: Fantasist 5.9.2003, 17:35
x77, посмотри библиотеку Jcl (входит в JVCL). Там делается hook на RaiseException из kernel. Delphi вызывает эту функцию при возникновении исключения, и в этот момент делается снимок call stack'a. Осталось теперь только посчитать сколько вызовов проходит от raise до вызова RaiseException. Только не знаю, чем поможет, например, информация о том, что Index of bound в TList был брошен из Classes. Разве что целиком стек сохранять.

Автор: x77 5.9.2003, 17:40
привет smile.gif

да, я нарыл уже, вернее, люди добрые посоветовали. в JCL есть забавная функция: JclLastExceptStackListToStrings. т.е. делаем JclStartExceptionTracking/JclStopExceptionTracking, включаем TD32 debug info, и в OnException можно получить картинку милого вида:

[0047451C] Unit2.TMy.DoIt (Line 60, "Unit2.pas")
[00474498] Unit2.TForm2.Button1Click (Line 43, "Unit2.pas")
[0044064A] Controls.TControl.Click (Line 4621, "Controls.pas")
[00436A07] StdCtrls.TButton.Click (Line 3347, "StdCtrls.pas")
[00436B6E] StdCtrls.TButton.CNCommand (Line 3399, "StdCtrls.pas")
[0044041F] Controls.TControl.WndProc (Line 4561, "Controls.pas")
[00443E96] Controls.TWinControl.WndProc (Line 6242, "Controls.pas")
[00436952] StdCtrls.TButtonControl.WndProc (Line 3327, "StdCtrls.pas")
[0044012A] Controls.TControl.Perform (Line 4468, "Controls.pas")
[00444058] Controls.DoControlMsg (Line 6288, "Controls.pas")
[00444835] Controls.TWinControl.WMCommand (Line 6474, "Controls.pas")
.....

Автор: x77 5.9.2003, 17:41
т.е. ты отслеживаешь не просто, откуда пришёл эксепшн, а всё, что было до его возникновения.

Автор: Fantasist 5.9.2003, 17:52
Цитата
т.е. ты отслеживаешь не просто, откуда пришёл эксепшн, а всё, что было до его возникновения.


Да, именно так. Об этом в общем-то и говорили. smile.gif

Автор: altarasjuk 12.9.2003, 13:58
Народ, дайте, плиз, ссылку на JclDebug.
Заранее сенкю smile.gif

Автор: x77 12.9.2003, 14:02
u r welcome smile.gif

http://sourceforge.net/projects/jcl/

Автор: altarasjuk 12.9.2003, 14:51
сенкю

Автор: altarasjuk 12.9.2003, 15:11
x77 и всем остальным, огромнейшее спасибо smile.gif

Автор: man2002ua 12.9.2003, 18:03
разленился народ... уже хотят, чтобы и ошибки за них программа искала wink.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)