我正在写我的第一台漂亮的打印机,有些麻烦。我的gdb是7.7。
这是我喜欢调试的C ++代码:
enum Country
{
CHINA,
USA
};
class Foo
{
public:
Foo(int _v, enum Country c) {v = _v; m_country = c;}
~Foo() { v = -1; }
int v;
enum Country m_country;
};
int main()
{
Foo f(10, CHINA);
return 0;
}
这是我的打印机:
import gdb
class FooPrinter:
def __init__(self, val):
self.v = val
def to_string(self):
# because v is integer, a simpler way is:
# return self.v['v']
v = "v=" + str(self.v['v'])
f = self.m_country['m_country']
if (f == 0):
c = "CHINA"
elif (f == 1):
c = "USA"
else:
c = "unknown"
c = "c=" + c
ret = v + '\n' + c
return ret
def lookup_type (val):
if str(val.type) == 'Foo':
return FooPrinter(val)
return None
gdb.pretty_printers.append (lookup_type)
当我在gdb中运行打印机时,出现此错误:
(gdb) source printer.py
(gdb) p f
Python Exception <class 'AttributeError'> 'FooPrinter' object has no attribute 'm_country':
我想我需要以某种方式修改__init__
以获取额外的国家/地区参数,但如果是这样,我应该如何更新其余代码?
答案 0 :(得分:0)
问题在于这一行:
f = self.m_country['m_country']
在这里,我想您想要检查一下self.v
:
f = self.v['m_country']
请注意,您还可以从枚举类型中获取所有枚举常量名称。因此,您可以使用更简单的查找替换链式if
。如果枚举大于几个常量,这很好。