Поделиться через


Использование псевдонимов

Псевдонимы — это символьные строки, которые автоматически заменяются другими символьными строками. Их можно использовать в командах отладчика, чтобы избежать повторения некоторых распространенных фраз.

Псевдоним состоит из имени псевдонима и эквивалентного псевдонима. При использовании имени псевдонима в составе команды отладчика имя автоматически заменяется эквивалентным псевдонимом. Эта замена происходит непосредственно перед анализом или выполнением команды.

Отладчик поддерживает три типа псевдонимов:

  • Вы можете задать и назвать псевдонимы с именами пользователей.

  • Псевдонимы с фиксированным именем можно задать, но они имеют имена $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).

Псевдонимы с фиксированными именами заменяются, если они используются рядом с другим текстом. Чтобы заменить псевдоним с именем пользователя, когда он находится рядом с другим текстом, заключите его в маркер ${ } (интерпретатор псевдонимов).

Замена псевдонима с фиксированным именем происходит до замены псевдонима пользователя.