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

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

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


person AnArrayOfFunctions    schedule 03.02.2015    source источник


Ответы (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.

person Thomas Weller    schedule 03.02.2015
comment
Можно ли вырезать только имена исключений, чтобы не передавать другой мусор в команду sxd? - person hypersw; 26.08.2016
comment
@hypersw: к сожалению, нет. Поскольку длина вывода непредсказуема, параметры /pS и /ps использовать нельзя. - person Thomas Weller; 27.08.2016
comment
@hypersw: вы, конечно, можете перечислить все исключения вручную. я отредактировал ответ - person Thomas Weller; 27.08.2016

В 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 (нарушение доступа) теперь не будет обрабатываться отладчиком каким-либо видимым образом.

В разделе справки «Управление исключениями и событиями» объясняется концепция первого шанса и второго шанса.

person Kjell Gunnar    schedule 03.02.2015

При желании вы можете управлять этим из графического интерфейса WinDbg 'Debug> Event Filters...', при этом откроется диалоговое окно, подобное этому:

введите здесь описание изображения

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

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

person EdChum    schedule 04.02.2015