Класс TPhotographer (модуль utPhotoExc) |
Назначение этого класса - фотографирование экрана при возникновении исключительной ситуации, а так же сохранение сообщения об ошибке вместе с журналом последних SQL-запросов и состоянием стека программы. Для формирования текста, отображающего состояние стека, используется либо собственная функция CrackStack, либо функции модуля StackUnit. Для того, чтобы сохранялся журнал SQL-запросов, должен использоваться компонент TNewQuery (модуль AdoSQLUnit).
Компонент разрабатывался для Delphi 5, но работает так же и в Delphi 6, и должен работать в Delphi 7. В более поздних версиях Delphi и его клонов не тестировался.
Подробное описание
Для использования модуля необходимо:
Application.OnException := Photographer.AppException;
Photographer.AppException.
Screen.OnActiveFormChange
и
Screen.OnActiveControlChange на методы соответственно
Photographer.FormChange
и Photographer.ControlChange
для того, чтобы в
журнал записывались данные о смене фокуса контролов:Screen.OnActiveFormChange := Photographer.FormChange;
Screen.OnActiveControlChange := Photographer.ControlChange;
LoginName
и
AppVersion
, чтобы в таблицу БД
с именем ErrLog
попадали желаемые значения.
Это необязательная операция, и если
ее не выполнить, в БД будет записана пустая строка в соответствующие
поля. Запись в таблицу БД - необязательная часть работы,
для того, чтобы она работала, необходимо определить символ условной
компиляции SAVE_TO_ERRLOG_DB
. Если требуется
только эта часть работы, и не нужно сохранять журналы в текстовой файл, то
больше ничего добавлять не требуется. Но если нужна и запись в текстовой
файл, следует определить в этом случае символ SAVE_TO_LASTERRLOG
. Если оба
эти символа не определены, то сохранение происходит только в текстовой файл.
На случай, если необходимо (временно) отключить и запись в журнал, и в базу
данных, не меняя код, есть возможность определить символ условной компиляции
NOSAVEERRORS
.Примечание: запись в базу данных не реализована для случая, когда используется компонент TODBCQuery (в нем нет работы с блоб-полями). Поэтому при установленном символе ODBC_DIRECT запись в таблицу ErrLog не будет производиться в любом случае. При отсутствии записи в БД по любой причине фотографирование экрана так же не производится.
utPhotoExc | StackUnit |
Функции модуля utPhotoExc
Кроме того, что написано выше, никаких других функций вызывать не требуется. Ниже приведённые функции вынесены в интерфейсную часть потому, что могут оказаться полезны сами по себе.
Имя свойства / декларация метода | Описание |
procedure LogFileOutPut( const Filename, Text: String ); | Добавляет текст в конец файла. Символы перехода на новую строку добавляются автоматически. Данная функция может быть полезна для формирования журналов работы. |
function ReplaceExtension( const s, NewExt: String ): String; | Меняет расширение файла, возвращает имя файла с измененным расширением. |
function CrackStack( AtAddr: DWORD ): String; | Возвращает расшифровку стека программы на момент вызова. При наличии файла с расширением .map (имя совпадает с именем приложения) из него извлекаются адреса функций и сопоставляются с адресами, полученными из стека возвратов. Данный способ работает не стопроцентно, из-за того, что стек возвратов может иметь в отдельных точках нестандартную структуру кадра возврата. |
function CrackSoftStack( idx: Integer ): String; | Возвращает состояние стека вызовов процедур и функций, для которых в начале выполнения оформлен вызов функции enter (модуль Stack). |
(C) by Vladimir Kladov, 2000-2010