はい、技術的に可能です。大した喜びではありませんが、他のスタック フレームのローカル変数の値を取得するには、ポインターを逆参照するようにデバッガーに指示する必要があります。
簡単な例:
#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 をオフにして、これらのアドレスが実行ごとに再現可能であることを期待することに注意してください。Project + Properties、Linker、Advanced、Randomized Base Address = No.