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

Материал из Русский WINE
Перейти к: навигация, поиск
Wackowiki-logo.png Blue Glass Arrow.svg MediaWiki logo.png
Эта страница была автоматически перемещена с old.wiki.etersoft.ru.
Эта страница наверняка требует чистки и улучшения — смело правьте разметку и ссылки.
Просьба по окончанию убрать этот шаблон со страницы.

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

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

Запуск с WINEDISABLEGEH=yes отключает глобальный обработчик исключений.

Например, для 1С 8 это отключает «Запись дампа» при ошибке.

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

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

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

Call SetUnhandledExceptionFilter. Current filter - адрес1, new filter - адрес2.

[A]llow, [i]gnore(default)?:

где адрес1 - адрес текущего глобального обработчика,

а адрес2 - адрес глобального обработчика, который навязывается программой.

a - подмена глобального обработчика произойдет.

i (или просто нажать на Enter) - подмены не произойдет.

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

Например:

Handled exception code=e06d7363, flags=1, addr=0x7b843228,

parameters[3]={19930520, 32e1e4, 10634efc}

[d]ebugger, [c]ontinue, [e]xit, [h]elp:


d - вызовет отладчик winedbg

c - продолжит выполнение программы, дав обработать исключение отлаживаемой программе

e - завершит программу

h - вывод на экран краткой справки

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

  • code - причина возникновения исключения: ее значения могу быть EXCEPTION_ILLEGAL_INSTRUCTION, EXCEPTION_ACCESS_VIOLATION, EXCEPTION_INT_DIVIDE_BY_ZERO, и т. п.

соответствия этих макросов с числовыми значениями можно искать в wine/include/winbase.h

  • flags - флаг исключения. Бывает двух значений:
#define EXCEPTION_CONTINUABLE        0

#define EXCEPTION_NONCONTINUABLE     0x01

(из wine/include/winnt.h)
  • addr - адрес где произошло исключение.

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

  • parameters - параметры исключения.

Зависят от вида исключения. Если отлаживаемая программа сама насильно вызвала исключение, то эти параметры она может передать в качестве аргументов при вызове RaiseException (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

Выяснение места потери выхода из CriticalSection:

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 SetUnhandledExceptionFilter 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
Search.png
Программы работающие в WineСкачатьШкольный Wine
WINE@Etersoft Общие сведенияУстановка на 64-битные ОСОсобенности разработкиПатчи для WINE@EtersoftАдминистративная установкаДополнительные компонентыКак получить WINE@Etersoft?Лицензия на документациюГлоссарийИспользование аппаратных ключей защиты в LinuxДополнительная информация • [ Совместная работа | по CIFSпо NFS ] • Изменение системных ограниченийРегистрация продуктаПошаговая инструкция по установке rpm-пакетовОбращение в службу поддержкиТерминальные решенияУстановка WINE@EtersoftПодписка на обновленияНастройка WINE@EtersoftРазработчикуEnterpriseЧто такое WINE@Etersoft SQLВозможностиСреда для запуска приложений WindowsИспользование WINE@EtersoftFAQ по использованию WINE@EtersoftОсновные командыWINE@Etersoft/LocalЧто такое WINE@Etersoft Local
Программы Запуск БЭСТ 4+Запуск Консультант+ (сетевой версии)ГарантF1Инфо-Бухгалтер 8.xНалогоплательщик ЮЛ
1C Отличия от обычного WineМестоположение базы 1С1C: Предприятие 7.7 в WINEНастройка 1С 7.7 для работы с SQL-серверомУстановка 1С: Предприятия 8.1Установка 1С: Предприятия 8.1 в трёхзвенном режиме
Пользователю
Помощь Использование WinecfgИспользование Regedit
Легальность DCOM95IE5DCOMMSXML
Утилиты для работы с Wine WinetricksWineToolsQ4WinePlayOnLinuxIEs4LinuxWine-DoorsSwine
Разработчику
Компоненты WindowsЗапрет отключения защиты программыУправление обработчиком исключенийStraceNTИзмерение скорости функций WinAPIGLУстройство чтения смарт-картПрофилированиеТесты для проверки интерфейсовНаписание тестов в системе WineАутентификация в домене ADРепозитории
Помощь Создание патчейНаписание приложения под wineОтправка патчейСборка eterhackСборка wine-public
Отладка Способы отладкиWINEDEBUGWinedbg
Разработка WINE
1CODBCWinHelpКомпасМетодикаТестирование доступаЦветаФайловый диалогТестированиеЛитератураИзображенияWin32ШрифтыФайловые блокировкиСсылкиКлючи защитыRPMWineGeckoListViewУпаковка Wine
Производителю
Родственные проекты
LUKReactOSARWINSSCrossOver
Прочее
PageSetupDlgFreeBSDWwr