Нужно сделать поддержку файла с заданными фильтрами для исключений, чтобы можно было просить клиента получить соответствующий backtrace в случае сложной проблемы, которая у нас не воспроизводится.
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-обработчиков, но это нужно ещё окончательно проверить на разных багах.
в плане ещё сделать команду вывода адресов списка векторных обработчиков
Не удалось применить данный метод при отладке Гарант (бага 419). Не удаётся выводить бактрейс при возникновении определённого исключения, всё-равно используется обработчик программы.
Описание опубликовано на http://freesource.info/wiki/WINE/UpravlenieObrabotchikomIskljuchenijj Движение по баге пока не планируется.