26 марта 2011 г.

Обработка ошибок - термины и определения

Краткий список определений (словарик) теминов, касающихся отладки и обработки ошибок. Этот список приведён с точки зрения Delphi и утилит трассировки исключений.

Выглядит как-то глупо, но бывают люди, которые этого не знают - вот в них буду кидать ссылкой.

Bug report - см. Баг-отчёт.

Bug - см. Баг.

Call stack - см. Стек вызовов.

Chained exception - см. Вложенное исключение.

Deadlock - см. Взаимная блокировка.

Debug information - см. Отладочная информация.

Error - см. Ошибка.

Exception handler - см. Обработчик исключения.

Exception handling - см. Обработка исключения.

Exception log - см. Баг-отчёт.

Exception tracer - см. Трейсер исключений.

Exception -см. Исключение.

Executable module - см. Исполняемый модуль.

Executable - см. Исполняемый модуль.

Freeze - см. Зависание.

Handled exception - см. Обработанное исключение.

Hang - см. Зависание.

Hardware exception - см. Аппаратное исключение.

Hook - см. Хук.

Hooking - см. Установка хука.

Injecting - см. Внедрение.

Leak - см. Утечка.

Memory leak -см. Утечка памяти.

Module - см. Модуль.

Nested exception - см. Вложенное исключение.

Resource leak - см. Утечка ресурса.

Software exception - см. Программное исключение.

Unhandled exception - см. Необработанное исключение.

Unit (Модуль) - .pas файл в Delphi.

Аппаратное исключение - (см. также: Исключение) это Исключение, которое возбуждается железом компьютера. Этот тип Исключений является асинхронным - эти Исключения могут возникать в любом месте и в любое время. Хорошо известное исключение Access violation (EAccessViolation) является примером Аппаратного исключения. В Delphi все Аппаратные исключения являются наследниками EExternalException.

Баг - (см. также: Ошибка) это дефект в программе. Это общий термин, используемый для описания ошибки, недостатка, сбоя или проблемы в программе или системе, которые приводят к неправильному или неожиданному результату, либо приводят к непредусмотренному поведению. Большинство Багов возникает из ошибок и опечаток, допущенными людьми в коде программы или её дизайне, но некоторые из них вызваны компилятором. Программа, которая содержит большое количество Багов, и/или Багов, которые серьезно мешают её функциональности, называется "бажной". Подробные отчеты о проблемах в программе, как правило, называются Bug reports (Баг отчётами), fault reports, problem reports, trouble reports, change requests и так далее. Многие люди путают Баги с Исключениями и наоборот, но это, очевидно, неправильно, так как Утечка - это тоже Баг. И далеко не все Исключения являются реальными Багами в коде (к примеру, Исключение возбуждаемое при невозможности открытии файла, как правило, Багом не является).

Баг-отчёт - (см. также: Необработанное исключение) это отчёт о возможном Баге в приложении. Он обычно содержит информацию об Исключении или Утечке. Баг отчёт обычно включает в себя один или несколько Стеков вызовов и некоторую информацию о системе, приложении и рабочем окружении. Баг отчёты хранятся в файлах. Часто один файл может хранить более одного Баг отчёта.

Взаимная блокировка - ситуация, когда два или более потоков бесконечно ждут друг друга. Такие ситуции являются Багами в приложении. Это частный случай Зависания.

Вложенное исключение - Исключение, возникшее во время работы (внутри) Обработчика исключений. Обычно называется таковым, только если между двумя исключениями сохранена связь.

Внедрение - может иметь различные значения. Обычно этот термин либо ссылается на Установку хука, либо на процесс добавления Отладочной информации в Исполняемый модуль.

Зависание - это ситуация, когда приложение перестаёт реагировать (отвечать) на внешние раздражители вроде пользовательского ввода или IPC-взаимодействий. Это может быть Баг в приложении, но не всегда. Если это состояние длиться бесконечно, то это - однозначный Баг. Частным случаем Зависания является Взаимная блокировка.

Исключение - это способ прервать обычное выполнение программы и выполнить некоторый код по обработке возникшей внештатной ситуации (исключения). В некоторых источниках Исключения называют "особыми ситуациями", "внештатными ситуациями" или "исключительными ситуациями", но термин "Исключение" всё же более устоявшийся. Исключение можно рассматривать как некоторое событие, которое прерывает нормальное выполнение программы. Хотя изначально Исключения введены для обработки внештатных (ошибочных) ситуаций, но они также являются и удобным средством прерывания обычного выполнения кода (например — нажатие пользователем кнопки "Отмена"). Также Исключения позволяют осуществлять единообразную обработку как программных, так и аппаратных ошибок. Обработка подразумевает написание кода "очистки" и/или кода по исправлению ошибки. Кроме того, Исключением также называют информационный объект, описывающий такое прерывание работы. Процесс возникновения Исключения обычно называют "возбуждением исключения" или "выбросом исключения" ("raising exception" или "throwing exception"). Исключения бывают Обработанными или Необработанными. Также Исключения делятся на Аппаратные или Программные.

Исполняемый модуль - говоря кратко, это .exe, .dll или .bpl файл. В общем, это ваш скомпилированный проект. Это файл, который содержит выполняемый код и который может быть загружен для исполнения кода.

Исполняемый файл - см. Исполняемый модуль.

Ловушка - см. Хук.

Мёртвая блокировка - см. Взаимная блокировка.

Модуль - имеет два значения. Это либо Исполняемый модуль, либо Unit. О чём идёт речь, обычно нужно понимать из контекста.

Необработанное исключение - (см. также: Исключение) может иметь несколько разных значений. Обычно под Необработанным исключением понимается любое Исключение, которое не является Обработанным исключением. Т.е. Исключение всплыло во всей цепочке обработчиков и не было никем обработано - вплоть до корневого обработчика от ОС. Такие Исключения означают немедленную смерть ("вылет") вашего приложения - если только на эту ситуацию не установлен Хук. Итак, это обычное значение слов "Необработанное исключение" в стандартных приложениях. Однако, когда в приложении используется Трейсер исключений, Необработанное исключение получает второй смысл - теперь оно обычно означает Исключение, которое не обрабатывается вашими Обработчиками исключений, но ловится Трейсером исключений (либо его Обработчиком исключений, либо его Хуками). Даже хотя технически это Исключение является Обработанным исключением - его называют Необработанным исключением, чтобы подчеркнуть его отличие от остальных Исключений. В этом случае, чтобы указать исходный смысл Необработанного исключения, обычно говорят "настоящее Необработанное исключение". Как можно догадаться, такой случай - достаточно редок в приложении с Трейсером исключений. Кроме того, иногда Необработанное исключение в его втором смысле употребляют и в случае обычных приложений Delphi (без Трейсера исключений), подразумевая любое исключение, достигающее глобального Обработчика исключений в объекте Application.

Обработанное исключение - (см. также: Исключение) это Исключение, которое было обработано Обработчиком исключений в процессе Обработки исключения.

Обработка исключения - (см. также: Исключение) обычно под этим понимается процесс обработки исключения, который может включать в себя такие операции как логгинг (см. Баг отчёт), показ сообщения об ошибке, откат операций и так далее. Этот процесс выполняется одним или несколькими (в случае перевозбуждения) Обработчиками исключений. Объект Исключения уничтожается после завершения Обработки исключения. См. также Обработанное исключение и Необработанное исключение.

Обработчик исключения - (см. также: Исключение) это код, который получает управление при возбуждении Исключения. Обычно он не является Хуком. Обработчик исключения либо выполняет очистку (try-finally) либо Обработку исключения (try-except).

Отладочная информация - (см. также: Внедрение) это информация о связи (соответствии) между скомпилированным машинным кодом (.exe/.dll/.bpl файл) и исходным текстом программы (.pas файл). Она используется для получения читабельных описаний адресов в программе, в частности - для построения Стека вызовов. Отладочная информация создаётся линкёром (linker) и сохраняется в .dcu файлах, а также может быть экспортирована в файлы .map или .tds. По умолчанию Отладочная информация не попадает в Исполняемый модуль (см. также: Внедрение).

Отчёт об ошибке - см. Баг-отчёт.

Ошибка - (см. также: Исключение) см. Баг. Многие люди путают Исключения с Ошибками и наоборот, но это, очевидно, неправильно, так как Утечка - это тоже Баг. И далеко не все Исключения являются реальными Ошибками в коде (к примеру, Исключение, возбуждаемое при невозможности открытии файла, как правило, Ошибкой не является). Впрочем, иногда Ошибка может быть использовано как синоним к слову Исключение, а не к слову Баг. Поэтому обычно лучше избегать слова Ошибка как многозначного. Предпочтительнее использовать слова Исключение, Утечка, Баг, опечатка. Особенно это заметно в словосочетании "возникает ошибка". Ошибка в коде программе не может "возникать" или "не возникать". Она там либо есть, либо её там нет (при условии неизменности кода программы). Правильнее говорить: "появляется сообщение", "выводит неверный результат", "происходит отказ в доступе" или ещё как-то.

Программное исключение - (см. также: Исключение) это Иключение, возбуждаемое по команде программного кода. Такие Исключения являются синхронными - они возникают только в определённых местах и в определённое время - а именно: когда код программы командует возбудить Исключение. Примером Программного исключения может служить, скажем, EStreamError. Это самый распространённый тип Исключений в приложениях.

Стек вызовов - это структура данных, которая хранит информацию об активных подпрограммах приложения. Этот вид стека также известен под именами execution stack, control stack, run-time stack или machine stack, и часто сокращается до просто "stack". Стек вызовов является центральной частью в любом Баг отчёте. Стек вызовов - это последовательность (массив) из адресов в коде (обычно с текстовым читабельным описанием - см. Debug information), каждый адрес представляет указатель на код вызова функции или процедуры. Суммарно эта цепочка адресов указывает, какие подпрограммы и в какой последовательности были вызваны, прежде чем выполнение дошло до текущей точки. В Баг отчёте конечной точкой является Исключение или создание Утечки.

Трейсер исключений - (см. также: Исключение) это утилита или код, который устанавливает Хуки и перехватывает возбуждение Исключений, позволяя создать Баг отчёт по Необработанным исключениям. Часто Трейсеры исключений имеют дополнительную функциональность, вроде сбора информации, отладочных возможностей, ловли Утечек и так далее. Известными Трейсерами исключений под Delphi являются EurekaLog и madExcept. JCL (JclDebug.pas + JclHookExcept.pas) часто используются для построения собственного Трейсера исключений.

Установка хука - (см. также: Хук) процесс установки Хука. Иногда называется Injecting (Внедрением), особенно когда подчёркивается недокументированность перехвата кода.

Утечка памяти - (см. также: Утечка) это тип Утечки, когда приложение выделяет, но не освобождает память.

Утечка ресурса - (см. также: Утечка) любая Утечка, не являющаяся Утечкой памяти.

Утечка - это вид Бага в приложении. Он происходит, когда приложение потребляет какой-то ресурс, но не освобождает его. Если этот ресурс является памятью (обычно: виртуальной), то Утечка называется Утечкой памяти.

Хук - это код, который вызывается вместо или перед другим кодом - на который "поставлен хук". Частным случаем Хука является обычный обработчик события. Обычно, если есть документированный стандартный способ установки вызова своего кода на какое-либо событие, то этот код называется обработчиком события. Если же такового способа нет, то код называется Хуком.

3 комментария :

  1. Еще можно было бы для ошибок написать кратко о причинах возникновения и методах поиска и устранения

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и (опционально) ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.