Как настроить поведение всех исключений так, чтобы они передавались приложению и не отображались в отладчике?
Я использую IDA Pro 6.6 и WinDbg.
Как настроить поведение всех исключений так, чтобы они передавались приложению и не отображались в отладчике?
Я использую IDA Pro 6.6 и WinDbg.
Немного неудобно делать это сразу для всех типов исключений.
.foreach(exc {sx}) {.catch{sxd ${exc}}}
Что оно делает:
{sx}
: перечислите все типы исключений (и текущие настройки, которые вам на самом деле не нужны)exc
: назначить переменную.foreach(...) {...}
: разрезать на части отдельных слов и выполнить командуsxd ${exc}
: отключить все, что находится в переменной exc.catch{...}
: игнорировать все сообщения об ошибках, которые приходят из информации о настройкахПреимущество вышеуказанного подхода в том, что он не зависит от версии WinDbg. Если будут введены новые коды исключений, он все равно будет работать.
Обработки нежелательного текста можно избежать с помощью PyKd. Сохраните следующий скрипт в файл sdx.py
и запустите !py sxd.py
:
from pykd import *
sx = dbgCommand("sx")
for s in sx.splitlines():
ex = s[:4]
if not ex=="" or ex.isspace():
print("sxd "+ex)
dbgCommand("sxd "+ex)
Другой вариант — обработка всех исключений вручную:
.foreach(exc {.echo "ct et cpr epr ld ud ser ibp iml out av asrt aph bpe bpec eh clr clrn cce cc dm dbce gp ii ip dz iov ch hc lsq isc 3c svh sse ssec sbo sov vs vcpp wkd rto rtt wob wos *"}) {.catch{sxd ${exc}}}
Однако, если в WinDbg есть новые коды исключений, их необходимо добавить в команду .echo
.
В Windbg семейство команд sx используется для управления обработкой исключений.
Для передачи исключения непосредственно в приложение используйте команду sxd, которая отключает конкретное исключение. (На самом деле отключить означает игнорировать первое случайное исключение) Насколько мне известно, вы должны использовать sxd для всех конкретных исключений, потому что sxd * означает все исключения, которые не названы явно иначе.
Используйте команду sx для просмотра доступных исключений и текущих настроек. И используйте sxd для всего, что хотите отключить.
0:000> sx
ct - Create thread - ignore
et - Exit thread - ignore
cpr - Create process - ignore
<cut>
av - Access violation - break - not handled
0:000> sxd av
0:000> sx
ct - Create thread - ignore
et - Exit thread - ignore
<cut>
av - Access violation - second-chance break - not handled
Вывод, на мой взгляд, немного сложно интерпретировать; av (нарушение доступа) теперь не будет обрабатываться отладчиком каким-либо видимым образом.
В разделе справки «Управление исключениями и событиями» объясняется концепция первого шанса и второго шанса.
При желании вы можете управлять этим из графического интерфейса WinDbg 'Debug> Event Filters...', при этом откроется диалоговое окно, подобное этому:
Здесь вы можете указать, как WinDbg обрабатывает каждый тип исключений и следует ли их включать, отключать, выводить на вывод консоли WinDbg или игнорировать, а затем при запуске события должен ли WinDbg или ваше приложение обрабатывать его.
Итак, в вашем случае вы можете выбрать «Игнорировать» и «Не обрабатываться» на странице MSDN, которая объясняет немного больше: https://msdn.microsoft.com/en-us/library/windows/hardware/ff541752(v=vs.85).aspx