Я не говорю о стеке вызовов.
Я хочу посчитать, сколько раз вызывается определенная функция, когда по адресу, удерживаемому ESP, находится определенное значение. Прежде чем вы скажете мне проверить адрес возврата, я не заинтересован в этом - адрес возврата в этом случае находится на ESP + 4, [ESP] содержит значение, которое извлекается до того, как функция вернется. Детали неважны.
Я могу подсчитывать вызовы функций со следующим синтаксисом:
bp MyFunction "r @$t0 = @$t0 + 1; r @$t0; gc"
Я могу отобразить двойное слово в [ESP], добавив
dd $csp L1
к вышеуказанной команде.
Проблема в том, что вызовов довольно много, и меня интересуют только определенные вызовы, и отслеживание их вручную после каждой точки останова раздражает и отнимает много времени.
Я все еще привыкаю к синтаксису WinDbg. Как должно выглядеть условие в моем выражении .if?
Я пробовал некоторые сумасшедшие вещи, такие как
.if( (dd $csp L1) == 2 )
Но это явно неправильно.
Я также думал об установке точки останова где-то в функции после того, как значение в [ESP] будет перемещено в локальную переменную (что-то вроде bp MyFunction+eip_after_assignment), но это уже слишком поздно. Я думаю, что могу работать с этим, но было бы проще, если бы я мог просто проверить [ESP] в начале.