漂亮的打印机帮助:对象没有属性

时间:2016-06-02 04:27:44

标签: gdb

我正在写我的第一台漂亮的打印机,有些麻烦。我的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__以获取额外的国家/地区参数,但如果是这样,我应该如何更新其余代码?

1 个答案:

答案 0 :(得分:0)

问题在于这一行:

    f = self.m_country['m_country']

在这里,我想您想要检查一下self.v

    f = self.v['m_country']

请注意,您还可以从枚举类型中获取所有枚举常量名称。因此,您可以使用更简单的查找替换链式if。如果枚举大于几个常量,这很好。