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