WinDBG - как установить все исключения для передачи в приложение?

Как настроить поведение всех исключений для передачи в приложение, а не для отображения в отладчике?

Я использую IDA Pro 6.6 и WinDbg.

3 ответа

Решение

Это немного неловко делать это для всех типов исключений одновременно

.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 "Отладка> Фильтры событий...", после чего откроется диалоговое окно, например:

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

Так что в вашем случае вы можете выбрать "Игнорировать" и "Не обработано" на странице MSDN, которая объясняет немного больше: https://msdn.microsoft.com/en-us/library/windows/hardware/ff541752(v=vs.85).aspx

Другие вопросы по тегам