| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Идеология репортинга ошибок |
| Автор: Medved 4.9.2003, 10:28 |
| Хочу в своем приложении (используется глобальная обработка ошибок). реализовать их репортинг. Т.е. при возникновении ошибок, чтобы генерировался отчет, что за ошибка произошла (класс ошибки), ее сообщение и в каком модуле и в какой процедуре она произошла. В принципе проблем нет, за исключением того, как узнать, в какой модуле произошла ошибка и в какой процедуре, если как я уже сказал используется глобальный обработчик. |
| Автор: gray_k 4.9.2003, 10:36 |
| Ну например заведи глобальную переменную и первой строкой каждого модуля или процедуры присваивай ей своё уникальное значение. А потом в обработчике ошибки смотри значение этой переменной. (мож можно как-то ещё, это я с ходу придумал |
| Автор: Vit 4.9.2003, 15:07 |
| Вряд ли это возможно. |
| Автор: altarasjuk 4.9.2003, 15:57 | ||
Vit, Не, ну уж тут ты не прав... Я тоже как то бился над подобным, но ничего не добился Pegas, если это не комерческая штуковина, то как найдёшь ответ, то скинь плиз алгоритм. Буду очень благодарен |
| Автор: stab 4.9.2003, 18:29 |
| в JEDI Code Library есть JclLastExceptStackListToStrings в модуле JclDebug, эта процедура как раз и реализует все выше описаное и, что не очень хорошо, требует включение map файлов, но без этого придется все ручками делать, т.е. заводить таблицу адресов процедур..., что, в принципе, равносильно map файлу |
| Автор: Medved 4.9.2003, 18:51 |
| Спасибо. |
| Автор: x77 4.9.2003, 20:01 | ||
да, subj. достаточно забавен. с модулем, кстати, елементарно: можно повесить TApplicationEvents и написать
но вот по адресу выцепить метод - задачка нетривиальная. стандартная рутина sysutils.MethodName (ExceptAddr) вернёт пусто, если метод не является published. причём я крупно подозреваю, что это не единственный подводный камень. в большинстве проектов, которые я видел обработка происходит аналогично тому, как сказал gray_k: исключительная ситуация возбуждается руками в блоке try..except с формированием мессага нужного вида. но вот глобально... типа, кинул компонент на форму - и вот оно, щасьте... - это действительно интересно |
| Автор: Medved 5.9.2003, 05:57 | ||
Да никто так и не собирается делать...... вы бы вопрос еще раз внимательно почитали..... |
| Автор: x77 5.9.2003, 09:07 |
| Pegas, я прочитал внимательно. суть в том, чтобы вся логика обработки ошибок была сосредоточена в одном месте, будт то dcu, будь то компонент на форме. и может она быть самой разной, мессага на экран или запись в лог. не придирайтесь |
| Автор: 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 |
| привет да, я нарыл уже, вернее, люди добрые посоветовали. в 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 | ||
Да, именно так. Об этом в общем-то и говорили. |
| Автор: altarasjuk 12.9.2003, 13:58 |
| Народ, дайте, плиз, ссылку на JclDebug. Заранее сенкю |
| Автор: x77 12.9.2003, 14:02 |
| u r welcome http://sourceforge.net/projects/jcl/ |
| Автор: altarasjuk 12.9.2003, 14:51 |
| сенкю |
| Автор: altarasjuk 12.9.2003, 15:11 |
| x77 и всем остальным, огромнейшее спасибо |
| Автор: man2002ua 12.9.2003, 18:03 |
| разленился народ... уже хотят, чтобы и ошибки за них программа искала |