Bug 2521

Summary: Сделать поддержку файлов с командами пропуска исключений
Product: WINE@Etersoft Reporter: Vitaly Lipatov <lav>
Component: Запуск ; Отладка ; ИсключенияAssignee: Anton Rudnev <mibori>
Status: CLOSED FIXED QA Contact:
Severity: critical    
Priority: P1 CC: kondratyuk, pav, vitperov
Version: 1.0.9   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on: 1990    
Bug Blocks:    
Attachments: Ловля программных исключений

Description Vitaly Lipatov 2008-09-25 22:35:14 MSD
Нужно сделать поддержку файла с заданными фильтрами для исключений,
чтобы можно было просить клиента получить соответствующий backtrace
в случае сложной проблемы, которая у нас не воспроизводится.
Comment 1 Anton Rudnev 2008-10-03 21:40:30 MSD
Created attachment 769 [details]
Ловля программных исключений

Если установлен патч из баги http://bugs.etersoft.ru/show_bug.cgi?id=1990
то откатить и наложить этот.


ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ
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-обработчиков, но это нужно ещё окончательно проверить на разных багах.
Comment 2 Anton Rudnev 2008-10-07 18:29:17 MSD
в плане ещё сделать команду вывода адресов списка векторных обработчиков
Comment 3 Виталий Перов 2008-12-15 20:43:58 MSK
Не удалось применить данный метод при отладке Гарант (бага 419).
Не удаётся выводить бактрейс при возникновении определённого исключения, всё-равно используется обработчик программы.
Comment 4 Vitaly Lipatov 2009-07-26 17:44:45 MSD
Описание опубликовано на
http://freesource.info/wiki/WINE/UpravlenieObrabotchikomIskljuchenijj
Движение по баге пока не планируется.