WinDbg: использование команд для условия в.if

WinDbg имеет оператор.if для условного выполнения команд:

   .if (Condition) { Commands } .else { Commands } 

Для Условия невозможно использовать команды WinDbg. Есть ли какой-либо косвенный способ использования команд для условия, например, через псевдорегистры?

Пример задачи для выполнения: Если файл журнала уже открыт, ничего не делать. Если файл журнала не открыт, используйте .logopen /t /u /d

С помощью .logfile я могу узнать, открыт ли журнал или нет. Но как проанализировать этот вывод и как присвоить результат псевдорегистру?

Любой другой способ без псевдо-регистров также приветствуется.

Поскольку пример может показаться не очень полезным, рассмотрите следующие задачи, которые можно автоматизировать с помощью сценариев или окна.cmdtree:

  • Загрузка правильной версии SOS, например .if (lm m clr == clr) { .loadby sos clr } .elseif (lm m mscorwks == mscorwks) {.loadby sos mscorwks}
  • То, что я всегда забываю делать, например .if (| == myprocess) {.childdbg 1; .sympath+ mydir}

1 ответ

Решение

Я проверил это, и он загружает правильный sos.dll, если он находит clr в списке модулей:.foreach (module {lm1m} ) { .if ($sicmp("${module}","clr") == 0) {.echo FOUND ${module}; .loadby sos.dll clr} }

Вы можете легко расширить его, используя .elsif и сравнивая модуль с "mscorwks".

Что касается проверки вашего процесса, я подключился к calc.exe и запустил | что дает мне: . 0 id: 6bc attach name: C:\Windows\system32\calc.exe

Мне нужен только последний токен, поэтому я могу пропустить первые шесть, указав /pS 6 для .foreach, Следующее использует сравнение с подстановочными знаками для * calc.exe и, если найдено, сообщает отладчику для отладки дочерних процессов:

.foreach /pS 6 (token {|}) {.echo ${token}; .if($spat("${token}","*calc.exe") == 1) {.echo FOUND MY APP;.childdbg 1} .else {.echo FAILED TO FIND MY APP} }

Также проверено и сработало.

пс. моя версия отладчика 6.2.8400.0

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