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 ++二进制文件的地方,这不一定是可能的...
您可以注释掉所有这些方法,并探索代码在编译器抱怨的所有位置。这比以前的要糟糕得多,并且它在运行时执行,因此很难确定将实际调用哪种方法。
与上述类似,您可以将所有上述方法标记为已弃用,但是它或多或少具有相同的问题。
有没有人建议确定何时何地实际修改字段?
不要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)