Использование псевдонимов
Псевдонимы — это символьные строки, которые автоматически заменяются другими символьными строками. Их можно использовать в командах отладчика, чтобы избежать повторения некоторых распространенных фраз.
Псевдоним состоит из имени псевдонима и эквивалентного псевдонима. При использовании имени псевдонима в составе команды отладчика имя автоматически заменяется эквивалентным псевдонимом. Эта замена происходит непосредственно перед анализом или выполнением команды.
Отладчик поддерживает три типа псевдонимов:
Вы можете задать и назвать псевдонимы с именами пользователей.
Псевдонимы с фиксированным именем можно задать, но они имеют имена $u 0, $u 1, ..., $u 9.
Отладчик задает и присваивает имена автоматическим псевдонимам.
Определение псевдонима User-Named
При определении псевдонима с именем пользователя можно выбрать имя псевдонима и эквивалент псевдонима:
Псевдоним может быть любой строкой, которая не содержит пробелов.
Эквивалент псевдонима может быть любой строкой. Если ввести его на клавиатуре, эквивалентный псевдоним не может содержать пробелы в начале или возврат каретки. Кроме того, можно задать для него значение строки в памяти, значение числового выражения, содержимое файла, значение переменной среды или выходные данные одной или нескольких команд отладчика.
Имя псевдонима и эквивалент псевдонима чувствительны к регистру.
Чтобы определить или переопределить псевдоним с именем пользователя, используйте команду как (Задать псевдоним) или aS (Задать псевдоним).
Чтобы удалить псевдоним, используйте команду ad (Удалить псевдоним).
Чтобы получить список всех текущих псевдонимов с именами пользователей, используйте команду al (List Aliases).
Определение псевдонима Fixed-Name
Существует 10 псевдонимов с фиксированным именем. Их псевдонимы: $u 0, $u 1, ..., $u 9. Их эквивалентами псевдонимов может быть любая строка, не содержащая нажатия клавиши ВВОД.
Используйте команду r (Registers), чтобы определить эквиваленты псевдонимов для псевдонимов с фиксированным именем. При определении псевдонима с фиксированным именем необходимо вставить точку (.) перед буквой "u". Текст после знака равенства (=) является эквивалентом псевдонима. Эквивалент псевдонима может включать пробелы или точки с запятой, но начальные и конечные пробелы игнорируются. Не следует заключать эквивалент псевдонима в кавычки (если в результатах не нужны кавычки).
Примечание Не путайте, используя команду r (Registers) для псевдонимов с фиксированным именем. Эти псевдонимы не являются регистрами или псевдорегистративными регистрами, даже если для задания эквивалентов псевдонимов используется команда r . Вам не нужно добавлять знак at (@) перед этими псевдонимами, и вы не можете использовать команду r для отображения значения одного из этих псевдонимов.
По умолчанию, если псевдоним с фиксированным именем не определен, это пустая строка.
Автоматические псевдонимы
Отладчик задает следующие автоматические псевдонимы.
Имя псевдонима | Эквивалент псевдонима |
---|---|
$ntnsym |
Наиболее подходящий модуль для символов NT в собственной архитектуре компьютера. Этот псевдоним может иметь значение ntdll или nt. |
$ntwsym |
Наиболее подходящий модуль для символов NT во время 32-разрядной отладки, использующий WOW64. Это может быть ntdll32 или другая 32-разрядная версия Ntdll.dll. |
$ntsym |
Наиболее подходящий модуль для символов NT, соответствующих текущему режиму компьютера. При отладке в собственном режиме этот псевдоним совпадает с $ntnsym. При отладке в не машинном режиме отладчик пытается найти модуль, соответствующий этому режиму. (Например, во время 32-разрядной отладки, использующего WOW64, этот псевдоним совпадает с $ntwsym.) |
$CurrentDumpFile |
Имя последнего файла дампа, загруженного отладчиком. |
$CurrentDumpPath |
Путь к каталогу последнего файла дампа, загруженного отладчиком. |
$CurrentDumpArchiveFile |
Имя последнего файла архива дампа (CAB-файла), загруженного отладчиком. |
$CurrentDumpArchivePath |
Путь к каталогу последнего файла архива дампа (CAB-файла), загруженного отладчиком. |
Автоматические псевдонимы аналогичны автоматическим псевдорегистрациям, за исключением того, что вы можете использовать автоматические псевдонимы с маркерами, связанными с псевдонимами (например , ${ }), а псевдорегистры нельзя использовать с этими маркерами.
Использование псевдонима в командном окне отладчика
После определения псевдонима его можно использовать в любой записи команды. Имя псевдонима автоматически заменяется эквивалентом псевдонима. Поэтому псевдоним можно использовать в качестве выражения или макроса.
Имя псевдонима правильно расширяется, даже если оно заключено в кавычки. Так как эквивалент псевдонима может содержать любое количество кавычек или запятой, эквивалент псевдонима может представлять несколько команд.
Псевдоним с именем пользователя распознается, только если его имя отделяется от других символов пробелами. Первый символ имени псевдонима должен начинаться со строки или следовать за пробелом, точкой с запятой или кавычками. Последний символ имени псевдонима должен заканчиваться строкой или следовать пробелом, точкой с запятой или кавычками.
Примечание Любой текст, вводимый в окне "Команда отладчика ", начинающийся с "as", "aS", "ad" или "al", не получает замены псевдонима. Это ограничение предотвращает отображение команд псевдонимов неработоспособно. Однако это ограничение также означает, что псевдонимы команд, следующих за ad или al в строке, не заменяются. Если вы хотите заменить псевдонимы в строке, которая начинается с одной из этих строк, добавьте точку с запятой перед псевдонимом.
Однако маркер ${ } можно использовать для развертывания псевдонима с именем пользователя, даже если он находится рядом с другим текстом. Этот маркер также можно использовать вместе с определенными переключателями, чтобы предотвратить расширение псевдонима или отобразить определенные значения, связанные с псевдонимом. Дополнительные сведения об этих ситуациях см. в разделе ${ } (интерпретатор псевдонимов)..
Псевдоним с фиксированным именем правильно расширяется из любой точки строки, независимо от того, как он внедрен в текст строки.
Нельзя использовать команды, доступные только в WinDbg (.open, .write_cmd_hist (Write Command History),.lsrcpath и .lsrcfix), а также несколько дополнительных команд (.hh, .cls, .wtitle, .remote, kernel-mode .restart и user-mode .restart) с псевдонимами.
Использование псевдонима в файле скрипта
При использовании псевдонима в файле скрипта необходимо соблюдать особую осторожность, чтобы убедиться, что псевдоним развернут в нужное время. Рассмотрим следующий сценарий:
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.echo value myAlias
}
ad myAlias
При первом выполнении цикла команда as, aS (Задать псевдоним) присваивает значение myAlias. Значение, присвоенное myAlias, равно 1 плюс 610000 (первый выход команды dd). Однако при выполнении команды .echo (Echo Comment) myAlias еще не развернута, поэтому вместо 610001 мы видим текст myAlias.
0:001> $$>< c:\Script02.txt
00610000 myAlias
00905a4d 0x610001
00000003 0x905a4e
00000004 0x4
0000ffff 0x5
Проблема заключается в том, что myAlias не разворачивается до ввода нового блока кода. Следующая запись цикла — это новый блок, поэтому myAlias расширяется до 610001. Но это слишком поздно: мы должны были видеть 610001 первый раз через цикл, а не второй раз. Эту проблему можно устранить, заключив команду .echo (Echo Comment) в новый блок, как показано в следующем сценарии.
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.block{.echo value myAlias}
}
ad myAlias
При изменении скрипта мы получаем следующие правильные выходные данные.
0:001> $$>< c:\Script01.txt
00610000 0x610001
00905a4d 0x905a4e
00000003 0x4
00000004 0x5
0000ffff 0x10000
Дополнительные сведения см. в разделах .block и ${ } (интерпретатор псевдонимов).
Использование токена FOREACH в псевдониме
При использовании маркера FOREACH в определении псевдонима необходимо соблюдать особую осторожность, чтобы обеспечить расширение маркера. Рассмотрим следующую последовательность команд.
r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {as myAlias Token}
al
Первая команда задает значение псевдорегистра $t 0 равным 5. Вторая команда удаляет все значения, которые могли быть ранее назначены myAlias. Третья команда принимает третий маркер команды ?@$t 0 и пытается назначить значение этого маркера myAlias. Четвертая команда выводит список всех псевдонимов и их значений. Мы ожидаем, что значение myAlias будет равно 5, но вместо этого значением является слово "Token".
Alias Value
------- -------
myAlias Token
Проблема заключается в том, что команда as находится в начале строки в теле цикла FOREACH . Когда строка начинается с команды as , псевдонимы и маркеры в этой строке не расширяются. Если мы поместим точку с запятой или пустое пространство перед командой as , то все псевдонимы или маркеры, которые уже имеют значение, будут расширены. В этом примере myAlias не разворачивается, так как у него еще нет значения. Маркер расширяется, так как имеет значение 5. Ниже приведена та же последовательность команд с добавлением точки с запятой перед командой as .
r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {;as myAlias Token}
al
Теперь мы получаем ожидаемые выходные данные.
Alias Value
------- -------
myAlias 5
Рекурсивные псевдонимы
Псевдоним с фиксированным именем можно использовать в определении любого псевдонима. Вы также можете использовать псевдоним с именем пользователя в определении псевдонима с фиксированным именем. Однако, чтобы использовать псевдоним с именем пользователя в определении другого псевдонима с именем пользователя, необходимо добавить точку с запятой перед командой as или aS , иначе замена псевдонима не выполняется в этой строке.
При использовании рекурсивных определений этого типа каждый псевдоним преобразуется сразу после его использования. Например, в следующем примере отображается 3, а не 7.
0:000> r $.u2=2
0:000> r $.u1=1+$u2
0:000> r $.u2=6
0:000> ? $u1
Evaluate expression: 3 = 00000003
Аналогичным образом в следующем примере отображается значение 3, а не 7.
0:000> as fred 2
0:000> r $.u1= 1 + fred
0:000> as fred 6
0:000> ? $u1
Evaluate expression: 3 = 00000003
Следующий пример также разрешен и отображает 9.
0:000> r $.u0=2
0:000> r $.u0=7+$u0
0:000> ? $u0
Evaluate expression: 9 = 00000009
Примеры псевдонимов
Псевдонимы можно использовать, чтобы не вводить длинные или сложные имена символов, как показано в следующем примере.
0:000> as Short usersrv!NameTooLongToWantToType
0:000> dw Short +8
Следующий пример аналогичен предыдущему, но в нем используется псевдоним с фиксированным именем.
0:000> r $.u0=usersrv!NameTooLongToWantToType
0:000> dw $u0+8
Псевдонимы можно использовать в качестве макросов для часто используемых команд. В следующем примере регистр eax увеличивается в два раза, а регистр ebx увеличивается в два раза.
0:000> as GoUp r eax=eax+1; r ebx=ebx+1
0:000> GoUp
0:000> GoUp
В следующем примере используется псевдоним для упрощения ввода команд.
0:000> as Cmd "dd esp 14; g"
0:000> bp MyApi Cmd
Следующий пример аналогичен предыдущему, но в нем используется псевдоним с фиксированным именем.
0:000> r $.u5="dd esp 14; g"
0:000> bp MyApi $u5
Оба предыдущих примера эквивалентны следующей команде.
0:000> bp MyApi "dd esp 14; g"
Файл Tools.ini
В CDB (и NTSD) можно предварительно определить псевдонимы с фиксированным именем в файлеtools.ini . Чтобы предварительно определить псевдоним с фиксированным именем, добавьте поля $u , которые вы хотите, в запись [NTSD], как показано в следующем примере.
[NTSD]
$u1:_ntdll!_RtlRaiseException
$u2:"dd esp 14;g"
$u9:$u1 + 42
Нельзя задать псевдонимы с именами пользователей в файле Tools.ini.
псевдонимы Fixed-Name и псевдонимы User-Named
Псевдонимы имен пользователей проще использовать, чем псевдонимы с фиксированным именем. Синтаксис их определений проще, и их можно перечислить с помощью команды al (List Aliases).
Псевдонимы с фиксированными именами заменяются, если они используются рядом с другим текстом. Чтобы заменить псевдоним с именем пользователя, когда он находится рядом с другим текстом, заключите его в маркер ${ } (интерпретатор псевдонимов).
Замена псевдонима с фиксированным именем происходит до замены псевдонима пользователя.