Вход:  Пароль:  
FreeSource: WINE/УправлениеОбработчикомИсключений ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |

Управление обработчиком исключений


Оглавление документа

Глобальный обработчик


Запуск с WINEDISABLEGEH=yes отключает глобальный обработчик исключений.
Например, для 1С 8 это отключает «Запись дампа» при ошибке.

Обработка программных исключений


Запуск с WINESEHBLOCK=all включает управляемую обработку программных исключений.


Вначале, при старте, отлаживаемая программа может попытаться подменить глобальный обработчик Unhandled Exception Filter?,
каким-то своим. Когда это происходит, ход выполнения останавливается и выводится на экран следующее:


Далее возникают программные исключения.
Например:


Как видно из сообщения об исключении, у него имеются некоторые атрибуты:


code – причина возникновения исключения: ее значения могу быть EXCEPTION_ILLEGAL_INSTRUCTION, EXCEPTION_ACCESS_VIOLATION, EXCEPTION_INT_DIVIDE_BY_ZERO, и т. п.
соответствия этих макросов с числовыми значениями можно искать в wine/include/winbase.h


flags – флаг исключения. Бывает двух значений:


addr – адрес где произошло исключение.
Возможно не всегда, но это скорее всего значение регистра IP команды, следующей за командой, где произошло исключение.


parameters – параметры исключения.
Зависят от вида исключения. Если отлаживаемая программа сама насильно вызвала исключение, то эти параметры она может передать в качестве аргументов при вызове Raise Exception? (http://msdn.microsoft.com/en-us/library/ms680552(VS.85).aspx)
количество параметров не превышает #define
EXCEPTION_MAXIMUM_PARAMETERS 15


По атрибутам можно установить скип – условие, состоящее из равенств атрибутов, которое, если оказывается истинно, для произошедшего исключения, то выполнение программы не приостанавливается, а проходит дальше.
Скип состоит из равенств разделенных пробелами, например:
addr=7b843228 code=e06d736 parameters[1]=32e1e4
По этому скипу, если произойдет исключение с кодом e06d736, по адресу 7b843228, и вторым параметром равным 32e1e4, то выполнение программы приостановлено не будет.
Скипов может быть несколько. Если сработает хотя бы один из списка, то программа продолжит своё выполнение не останавливаясь.


Для работы со скипами можно использовать следующие команды:
s – выводит список скипов
s+ СТРОКА_СКИПА – добавляет к списку скипов новый скип указанный в СТРОКА_СКИПА
s- НОМЕР_СКИПА – удаляет из списка скипов скип по его номеру
s. – добавляет скип для текущего исключения в список скипов без параметров
s= – добавляет скип для текущего исключения в список скипов с параметрами результат добавления/удаления скипа, можно увидеть через вывод списка скипов.


http://bugs.etersoft.ru/show_bug.cgi?id=1990


Выяснение места потери выхода из Critical Section?:
http://bugs.etersoft.ru/show_bug.cgi?id=2444


Управление из скрипта

WINE_UE_BLOCK=yes
автоматически блокирует попытку установки глобального обработчика исключений


WINE_UE_BLOCK=no
автоматически допускает установку глобального обработчика исключений


WINE_UE_BLOCK=console
при попытке сменить глобальный обработчик исключений спрашивает у пользователя


если WINE_UE_BLOCK не задана, а переменная WINE_HE_BLOCK
задана, то принимается по умолчанию
WINE_UE_BLOCK=console


WINE_HE_BLOCK=имя_файла
Если установлена эта переменная, то ловятся программные исключения.


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


Файл не обязательно должен существовать. Если файла не существует, то, в момент первого программного исключения список фильтров будет пуст, и вызовется консоль, с возможностью ввода команд.


После каждой команды, действующий список фильтров в памяти записывается в файл «имя_файла.out». Таким образом, как бы не изменялся список фильтров из консоли во время выполнения программы, результирующий список фильтров всегда будет доступен в этом файле после завершения/краха. И его опять же можно подать в качестве входного списка фильтров через переменную WINE_HE_BLOCK. И теоретически можно описать такой файл фильтров, при котором программа будет сваливаться в отладчик только при определённом исключении, а остальные исключения пропускать.


В МОМЕНТ ПЕРЕХВАТА УСТАНОВКИ ГЛОБАЛЬНОГО ОБРАБОТЧИКА
если WINE_UE_BLOCK=console запрашивается:
Block Set Unhandled Exception Filter? old=адрес1, new=адрес2
(yes/no/exit)?
адрес1 – адрес старого обработчика
адрес2 – адрес нового обработчика


ответы:
yes – блокируем установку обработчика
no – разрешаем установку обработчика
exit – завершаем программу


КОМАНДЫ (были изменены)
– подсказка
h – выводит краткую подсказку


– управление
d – Вызвать отладчик
с – продолжить выполнение программы
e – завершить выполнение программы


-действия над фильтрами
f – вывести список фильтров
f- number – удалить фильтр из списка по его номеру


-добавление отладочных фильтров (если выражение фильтров окажется истинно, то вызовется отладчик)
fd+ filt_expr добавить новый отладочный фильтр
fd. добавить новый отладочный фильтр для текущего исключения
fd= добавить новый отладочный фильтр для данного исключения с параметрами


– добавление скипперов (если выражение фильтра окажется истинного для данного исключения, то выполнение программы будет продолжено)
fs+ filt_expr добавить новый скиппер
fs. добавить новый скиппер для текущего исключения
fs= добавить новый скиппер для текущего исключения с параметрами


– добавление консольных фильтров (если выражение фильтра окажется истинно, то)
fc+ filt_expr добавить новый консольный фильтр
fc. добавить новый консольный фильтр для текущего исключения
fc= добавить новый консольный фильтр для текущего исключения с параметрами


– добавление фильтра выхода (если выражение фильтра истинно, то происходит выход из программы)
fe+ filt_expr добавление нового фильтра выхода
fe. добавление фильтра выхода для текущего программного исключения
fe= добавление фильтра выхода для текущего программного исключения с параметрами


ВЫРАЖЕНИЕ_ФИЛЬТРА (не изменилось)
Выражение фильтра состоит из равенств, разделённых пробелами.
Пример:
addr=7b843228 code=e06d736 parameters[1]=32e1e4


Это выражение окажется верным, если произойдёт исключение
с кодом e06d736, по адресу 7b843228, и вторым параметром равным 32e1e4.


В общий список действующих фильтров и в файл перед выражением фильтра записывает литера поведения, в том случае, если выражение фильтра «сработает»:


s <выражение_фильтра> – если фильтр окажется верным, то выполнение программы продолжится и вызовется оригинальный обработчик
d <выражение_фильтра> – если фильтр сработает, то вызовется отладчик
e <выражение_фильтра> – если фильтр сработает, то произойдёт завершение программы
c <выражение_фильтра> – если фильтр сработает, то выполнение остановится с консолью в ожидании команды от пользователя


Примечание: в файле фильтров не должно быть пустых строчек (особенно в конце).


Эта версия теоретически должна реагировать и предотвращать выполнение как SEH-обработчиков, так и VEH-обработчиков, но это плохо проверено/


http://bugs.etersoft.ru/show_bug.cgi?id=2521


Страницы, ссылающиеся на данную: WINE


 
Файлов нет. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]