Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этих разделах содержатся примеры выражений MASM и C++, которые используются в различных командах.
Все остальные разделы этой справочной документации используют синтаксис выражения MASM (если иное не указано). Синтаксис выражений C++ очень полезен для управления структурами и переменными, но не анализирует параметры команд отладчика очень хорошо.
Если вы используете команды отладчика для общих целей или используете расширения отладчика, необходимо задать синтаксис выражения MASM в качестве синтаксиса по умолчанию, например с помощью .expr (выбор средства оценки выражений). Если у вас должен быть определенный параметр для использования синтаксиса выражения C++, используйте синтаксис @@( ).
Если myInt является ULONG32 значением и используете средство оценки выражений MASM, в следующих двух примерах показано значение MyInt.
0:000> ?? myInt
0:000> dd myInt L1
Однако в следующем примере показан адресmyInt.
0:000> ? myInt
Условные точки останова
Операторы сравнения можно использовать для создания условных точек останова. В следующем примере кода используется синтаксис выражения MASM. Так как текущий радикс по умолчанию равен 16, в примере используется префикс 0n , чтобы число 20 было понято как десятичное число.
0:000> bp MyFunction+0x43 "j ( poi(MyVar)>0n20 ) ''; 'gc' "
В предыдущем примере MyVar является целым числом в источнике C. Так как средство синтаксического анализа MASM обрабатывает все символы как адреса, в примере должен быть оператор poi для разыменования MyVar.
Условные выражения
В следующем примере выводится значение ecx, если eax больше ebx, 7, если eax меньше ebx, и 3, если eax равно ebx. В этом примере используется средство оценки выражений MASM, поэтому знак равенства (=) является оператором сравнения, а не оператором назначения.
0:000> ? ecx*(eax>ebx) + 7*(eax<ebx) + 3*(eax=ebx)
В синтаксисе C++, знак @ указывает на регистр, двойной знак равенства (==) является оператором сравнения, а код должен явно приводить из BOOL в int. Таким образом, в синтаксисе C++ предыдущая команда преобразуется в следующую.
0:000> ?? @ecx*(int)(@eax>@ebx) + 7*(int)(@eax<@ebx) + 3*(int)(@eax==@ebx)
Примеры смешанных выражений MASM и C++
Нельзя использовать выражения исходной строки в выражении C++. В следующем примере используется альтернативный синтаксис оценщика @@( ) для вложения выражения MASM в выражение C++. Этот пример задает MyPtr равным адресу строки 43 файла Myfile.c.
0:000> ?? MyPtr = @@( `myfile.c:43` )
В следующих примерах интерпретатор выражений по умолчанию задан на MASM, а затем оценить Expression2 как C++ выражение, и оценить Expression1 и Expression3 как MASM выражения.
0:000> .expr /s masm
0:000> bp Expression1 + @@( Expression2 ) + Expression3
Если myInt является значением типа ULONG64 и вы знаете, что за ним в памяти следует еще одно значение типа ULONG64, можно установить точку останова доступа в этом месте, воспользовавшись одним из следующих примеров. (Обратите внимание на использование арифметики указателя.)
0:000> ba r8 @@( &myInt + 1 )
0:000> ba r8 myInt + 8