Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Псевдонимы — это символьные строки, которые автоматически заменяются другими символьными строками. Их можно использовать в командах отладчика, чтобы избежать повторения некоторых распространенных фраз.
Псевдоним состоит из имени псевдонима и эквивалентного псевдонима. При использовании имени псевдонима в составе команды отладчика имя автоматически заменяется эквивалентным псевдонимом. Эта замена происходит непосредственно перед анализом или выполнением команды.
Отладчик поддерживает три типа псевдонимов:
Вы можете задать и назвать псевдонимы с именами пользователей.
Псевдонимы с фиксированным именем можно задать, но они имеют имена $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).
Псевдонимы с фиксированными именами заменяются, если они используются рядом с другим текстом. Чтобы заменить псевдоним с именем пользователя, когда он находится рядом с другим текстом, заключите его в маркер ${ } (интерпретатор псевдонимов).
Замена псевдонима с фиксированным именем происходит до замены псевдонима пользователя.