Да, это технически возможно. Заметьте, большого удовольствия не доставляет: вам придется указать отладчику разыменовать указатель, чтобы получить значение локальной переменной в другом кадре стека.
Простой пример:
#include "stdafx.h"
#include <iostream>
void foo() {
for (int ix = 0; ix < 5; ++ix) {
std::cout << ix << " "; // <=== Conditional breakpoint here
}
}
void bar() {
for (int jx = 0; jx < 5; ++jx) {
std::cout << jx << ": "; // <=== Start with a breakpoint here
foo();
std::cout << std::endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
bar();
return 0;
}
Сначала вам нужно получить адрес переменной, для которой вы хотите установить условие. Установите точку останова на указанной строке в bar(). Когда он сработает, оцените &jx
и скопируйте значение.
Теперь установите условную точку останова, используя это значение. Я использовал:
*(int*)0x0073fbc8 == 2 && ix == 3
Где 0x0073fbc8 было значением, которое я получил в первой точке останова. Или вы можете сделать его относительным из регистра базового указателя. Установите безусловную точку останова, и когда она сработает, используйте Debug + Windows + Registers, чтобы посмотреть значение EBP. Вычтите его из значения &jx. Я использовал:
*(int*)(ebp+0xd8) == 2 && ix == 3
Оба работали хорошо. Обратите внимание, что вам нужно отключить ASLR для отладочной сборки, чтобы иметь некоторую надежду на то, что эти адреса повторяются от одного запуска к другому. Проект + Свойства, Компоновщик, Расширенный, Рандомизированный базовый адрес = Нет.
person
Hans Passant
schedule
13.05.2014