我没有使用 WinDbg 的经验,我正在尝试在 C++ Win32 应用程序中的静态成员变量上设置数据断点 (ba),以查看它何时被意外写入损坏。我们将其称为 MyClass::m_StaticData。我明白,首先我需要找到 MyClass::m_StaticData 的内存地址。但是,我不确定如何找到静态成员变量的地址。我找到了局部变量 (dv) 和类实例 (dt) 的命令,但没有找到静态的任何命令。
让我们考虑以下 C++ 代码:
class Box {
public:
static int objectCount;
Box(double l = 2.0, double b = 2.0, double h = 2.0) {
length = l;
breadth = b;
height = h;
objectCount++;
}
double Volume() {
return length * breadth * height;
}
static int getCount() {
return objectCount;
}
private:
double length;
double breadth;
double height;
};
int Box::objectCount = 0;
int main(void) {
Box Box1(3.3, 1.2, 1.5);
return 0;
}
有些编译器会做不同的事情,但 MSVC 会编译上面的代码并将类的静态变量存储在 PE32 二进制文件的 .data 段中,您可以看到如何被引用,并且我们可以确认正在存储
您需要在代码的编译版本中搜索交叉引用,以便获取变量初始化时分配的相对地址。我不知道这可以通过 WinDbg 轻松完成,因此通过查看引用静态变量的第一个代码偏移量,您将获得变量的 RVA,然后您可以在那里设置数据访问断点。