如何跟踪由外部代码修改类变量的所有地方?

Mak*_*gan 5 c++ debugging runtime

假设我有一个这样的类定义:

class A {
private:
    Field f;
public:
   /*A hundred methods all of which modify f*/

    m1();
    m2();
    ...
    m100();
}
Run Code Online (Sandbox Code Playgroud)

我们事先知道,所有这些方法(如果调用)将修改f。

假设您有一个非常意大利面条的代码库。

您需要在运行时查找是否实际修改了f。

您可以使用gdb,在每个方法上设置一个断点,查看执行在哪里停止,然后展开堆栈以查看哪个方法称为m *()方法中的任何一个。这是非常慢的,容易发生人为错误,在使用emscripten的代码库中或者在设置某些状态后python调用C ++二进制文件的地方,这不一定是可能的...

您可以注释掉所有这些方法,并探索代码在编译器抱怨的所有位置。这比以前的要糟糕得多,并且它在运行时执行,因此很难确定将实际调用哪种方法。

与上述类似,您可以将所有上述方法标记为已弃用,但是它或多或少具有相同的问题。

有没有人建议确定何时何地实际修改字段?

Pau*_*ans 3

不要Field直接使用,而是使用一个包装器,让您知道何时f修改。像这样的东西(非常粗略地):

class FieldLogWhenModified
{
    Field data_;
public:
    FieldLogWhenModified(Field f) : data_(f) {}
    FieldLogWhenModified& operator=(const FieldLogWhenModified& new_f)
    {
        data_ = new_f.data_;
        // log or alert user in some way
        return *this;
    }
Run Code Online (Sandbox Code Playgroud)

和/或也许:

    Field& operator=(const Field& new_data)
    {
        data_ = new_data;
        // log or alert user in some way
        return data_;
    }
Run Code Online (Sandbox Code Playgroud)