Если вы знаете, что никогда не будет определено более одной «дочерней» точки останова ba
, вы можете использовать псевдорегистр @$bpN
, установив команду «управляющей» точки останова на:
ba1 w4 /1 @esp+4 "dd @$bp1"
То есть укажите номер точки останова, который должен быть назначен этой новой точке останова, и псевдорегистр для этой точки останова все еще определен в команде точки останова.
Однако, если вы думаете, что управляющая точка останова будет срабатывать несколько раз, и хотите определить несколько точек останова ba
, это, очевидно, не сработает, потому что тогда «точка останова 1» будет просто переопределяться каждый раз. Но вы все еще можете это сделать!
Хитрость заключается в том, чтобы команда управляющей точки останова фактически содержала буквальный текст адреса, а не пыталась пройти через псевдорегистр. И вы можете сделать это с текстовыми псевдонимами.
Попробуйте это для контрольной точки останова:
bu @WHATEVER "aS /x ${/v:baaddy} @esp+4; .block{ ba w4 /1 baaddy \"dd baaddy\"; ad ${/v:baaddy} }"
Когда срабатывает контрольная точка останова, происходит следующее:
- Псевдоним устанавливается для текста "baaddy" с значением вычисления выражения
@esp+4
.
.block
гарантирует, что расширение псевдонима произойдет для дальнейшего.
- Затем интерпретатор псевдонимов расширит все вхождения «baaddy» в блоке, за исключением команды
ad
(из-за ключа /v).
- Таким образом, если значение
@esp+4
равно 0x1234
, команда точки останова доступа буквально становится: ba w4 /1 0x1234 \"dd 0x1234\"
со встроенным в нее фактическим адресом.
- Затем текстовый псевдоним удаляется.
Важно удалить текстовый псевдоним в конце, иначе при следующем срабатывании этой контрольной точки останова расширение псевдонима произойдет перед командой aS
, а "baaddy" будет расширено с использованием предыдущего значение. Это также означает, что этот текстовый псевдоним не должен существовать при первой установке управляющей команды точки останова.
person
Kurt Hutchinson
schedule
13.10.2014