TApplicationEvents как динамический компонент или статический для трассировки, называемой подпрограммой в Delphi - PullRequest
2 голосов
/ 12 июля 2009

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

В сети (http://delphi.about.com) хороший обработчик событий, но он просто копирует системную ошибку в файл, но я хотел бы расширить его возможности, захватывая память и стек (и информацию о процессоре, если у меня будет время) ). Должен ли я знать, если я вызываю его динамически, не добавляя его компонент в форму?

procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception) ;
var
   ErrorLogFileName : string;
   ErrorFile : TextFile;
   ErrorData : string;
begin
   ErrorLogFileName := ChangeFileExt(Application.ExeName,'.error.log') ;
   AssignFile(ErrorFile, ErrorLogFileName) ;

   //either create an error log file, or append to an existing one
   if FileExists(ErrorLogFileName) then
     Append(ErrorFile)
   else
     Rewrite(ErrorFile) ;

   try
     //add the current date/time and the exception message to the log
     ErrorData := Format('%s : %s',[DateTimeToStr(Now),E.Message]) ;
     WriteLn(ErrorFile,ErrorData) ;
   finally
     CloseFile(ErrorFile)
   end;

   //Show the exception
   Application.ShowException(E) ;
end;

... и http://delphi.about.com/cs/adptips2001/a/bltip0101_2.htm

Как мы знаем, Delphi также обеспечивает управление памятью, немного похожее на C - используя амперсанды и функции Pascal, но что будет наиболее эффективным ведением журнала?

Спасибо, прежде чем! Надеюсь, эта тема будет полезна другим качественным программистам.

Ответы [ 2 ]

6 голосов
/ 12 июля 2009

Может быть стоит взглянуть на сторонние компоненты вместо того, чтобы что-то писать самостоятельно. И EurekaLog , и madExcept делают в точности то, что вам нужно. Оба дают отличные результаты и поддерживают подключение к системам отслеживания ошибок, таким как FogBugz , Mantis и BugZilla . Благодаря этому вы сможете сопоставлять полученные отчеты об ошибках, выявлять общие шаблоны и, надеюсь, быстрее исправлять ошибки.

Лично установка Jedi JVCL / JCL немного излишня, просто она отслеживает исключения, так как это довольно сложная установка. Оба вышеперечисленных продукта являются коммерческими, но вы получаете то, за что платите.

3 голосов
/ 12 июля 2009

IIUC, вам нужен отчет о трассировке стека с номерами строк, системной информацией и т. Д. IOW что-то вроде этого:

Exception class: EVariantTypeCastError
Exception address: 004170ED
------------------------------------------------------------------------------
Stack list, generated 12/7/2009 11:32:19
[004170E8]{A.exe       } Variants.HandleConversionException (Line 614, "sys\variants.pas" + 10)
[0057ACAC]{A.exe       } cxDataStorage.TcxSmallintValueType.SetDataValue (Line 1067, "cxDataStorage.pas" + 2)
[005AC6C5]{A.exe       } cxCustomData.TcxCustomDataController.SetStoredValue (Line 12752, "cxCustomData.pas" + 2)
[005A8AD3]{A.exe       } cxCustomData.TcxCustomDataController.SetValue (Line 10401, "cxCustomData.pas" + 12)
[0059DA0B]{A.exe       } cxCustomData.TcxCustomDataProvider.SetEditValue (Line 3180, "cxCustomData.pas" + 4)
[005A8F9B]{A.exe       } cxCustomData.TcxCustomDataController.SetEditValue (Line 10560, "cxCustomData.pas" + 2)
[0066EBBE]{A.exe       } cxGridCustomTableView.TcxCustomGridTableItem.SetEditValue (Line 14396, "cxGridCustomTableView.pas" + 1)
[006637C5]{A.exe       } cxGridCustomTableView.TcxGridEditingController.UpdateValue (Line 7474, "cxGridCustomTableView.pas" + 4)
[00673F30]{A.exe       } cxGridCustomTableView.TcxCustomGridTableView.UpdateRecord (Line 17771, "cxGridCustomTableView.pas" + 1)
[0059D97F]{A.exe       } cxCustomData.TcxCustomDataProvider.PostEditingData (Line 3170, "cxCustomData.pas" + 1)
[00A80870]{A.exe       } fFilterLine.TFilterLine.UMLayoutChanged (Line 1034, "fFilterLine.pas" + 0)
[00482DBF]{A.exe       } Controls.TWinControl.WndProc (Line 7304, "Controls.pas" + 111)
[004824E8]{A.exe       } Controls.TWinControl.MainWndProc (Line 7073, "Controls.pas" + 3)
[00431D84]{A.exe       } Classes.StdWndProc (Line 11583, "common\Classes.pas" + 8)
[0049F981]{A.exe       } Forms.TApplication.MessageBox (Line 8293, "Forms.pas" + 22)
[0049FA99]{A.exe       } Forms.TApplication.ShowException (Line 8312, "Forms.pas" + 3)
[00A7D7B1]{A.exe       } ExceptionDlg.TfrmException.ExceptionHandler (Line 428, "..\Shared\ExceptionDlg.pas" + 2)

...
<snipped>
...

------------------------------------------------------------------------------
System   : Windows XP Professional, Version: 5.1, Build: A28, "Service Pack 2"
Processor: Intel, Intel(R) Core(TM)2 Quad CPU    Q6700  @ 2.66GHz, 2666 MHz MMX 64 bits
Memory: 1043; free 196
Display  : 1920X1200 pixels, 32 bpp
------------------------------------------------------------------------------
Active Controls hierarchy:
TcxCustomInnerTextEdit ""
TcxTextEdit ""
TcxGridSite ""
TcxGrid "cxgHeader"
TPanel "pnlMain"
TTabSheet "tshAccMov"
TPageControl "pcoMov"
TfrmMain "frmMain"
------------------------------------------------------------------------------

... ну, имхо, не стоит изобретать велосипед. Это уже сделано, и это бесплатно. Загрузите (если вы этого еще не сделали) JEDI JVCL + JCL из SourceForge и установите их. В файле | Новый | Другое | Файлы Delphi ... появится новый элемент: 'Диалог исключений Jcl для Delphi' .

И (imho) это гораздо более зрелый / продвинутый уровень, чем вы можете сделать «если у вас будет время». Также вы можете настроить сгенерированный обработчик исключений в соответствии с вашими потребностями. Для этого также есть группа поддержки. Кроме того, IIRC, вам нужен только JCL для диалога, но я не уверен. Кроме того, у вас есть также коммерческие опции для этого (madExcept, EurekaLog и т. Д.), Но это только продвинутые средства регистрации ошибок, в то время как JVCL, кроме того, бесплатен, даст вам также более 600 компонентов для игры.

НТН

...