anisha@linux-dopx:~/> gdb a.out
(gdb) watch dummyA::x
Cannot reference non-static field "x"
(gdb)
x
是名为 dummyA 的类的私有成员
如何在班级的私人成员上设置观察点?
语言:C ++
平台:Linux
#include <iostream>
using namespace std;
class dummyA
{
int x;
public:
dummyA ()
{
x = 0;
}
void test ()
{
x++;
}
};
int main ()
{
dummyA obj;
obj.test ();
obj.test ();
obj.test ();
}
输出:
(gdb) watch obj.x
No symbol "obj" in current context.
(gdb) watch obj::x
No symbol "obj" in current context.
现在,这个错误意味着什么?
答案 0 :(得分:3)
假设你有这个:
class A {
private:
int x;
}
int main()
{
A foo;
A bar;
return 0;
}
现在您有两个名为A
和foo
的{{1}}个实例。如果您告诉调试器注意bar
它是如何知道您的意思是什么?
当您观察实例变量(每个实例有一个)而不是静态变量(每个类只有一个)时,您需要指定要监视的实例变量。您正在指定要观看的类变量。虽然使用静态变量(每个类只有一个静态变量)就可以了,但实例变量并不合适。
在这种情况下,在A::x
中,在单步执行main
和A foo;
后,您可以执行以下操作:
A bar;
或
watch foo.x
它会工作得很好。你必须超越这些行,因为在它们之后,甚至不存在名称(更不用说它们所引用的对象)。
答案 1 :(得分:1)
GDB似乎认为这是一个非静态成员,因此您需要一个实例化对象来获取它。
您确定您已将此类成员标记为static
吗?如果您希望通过类访问它,它必须是静态的(特定于类而不是特定于对象)。
使用以下程序:
#include <iostream>
class xyzzy { public: int x; };
//int xyzzy::x = 7;
int main (void) {
xyzzy plugh;
plugh.x = 42;
std::cout << plugh.x << '\n';
return 0;
}
我的会话与你的会话类似:
(gdb) b main
Breakpoint 1 at 0x80485cd: file qq.cpp, line 12.
(gdb) run
Starting program: /home/pax/qq
Breakpoint 1, main () at qq.cpp:12
12 plugh.x = 42;
(gdb) watch xyzzy::x
Cannot reference non-static field "x"
(gdb)
但是,当我x
静态并取消注释初始化时,我会更成功:
(gdb) b main
Breakpoint 1 at 0x80485cd: file qq.cpp, line 6.
(gdb) run
Starting program: /home/pax/qq
Breakpoint 1, main () at qq.cpp:6
6 plugh.x = 42;
(gdb) watch xyzzy::x
Hardware watchpoint 2: xyzzy::x
如果你想观看一个对象(而不是类)的成员,你必须等到它被证实,例如:
#include <iostream>
class xyzzy { public: int x; };
int main (void) {
xyzzy plugh;
plugh.x = 42;
std::cout << plugh.x << '\n';
return 0;
}
和成绩单:
(gdb) b main
Breakpoint 1 at 0x80485cd: file qq.cpp, line 5.
(gdb) run
Starting program: /home/pax/qq
Breakpoint 1, main () at qq.cpp:5
5 plugh.x = 42;
(gdb) watch plugh.x
Hardware watchpoint 2: plugh.x
(gdb)
答案 2 :(得分:0)
由于x
是您的类的私有成员,因此它的信息(以及它的内存位置)取决于您访问它的对象(this
指针)。
因此,您需要将手表设置在有关对象的范围可访问引用的位置(如果您使用成员方法,则包括this
指针)。
另一个解决方案可能是使用访问器和mutators,并通过这些访问器专门访问您的变量。然后你就可以在存取器和放大器中放置一个标准断点。 mutators,它允许您打破对私有ivar x
的任何访问,而无需特定于对象的信息。