gdb print命令中自包含的字符串子类的递归输出

时间:2017-07-18 23:00:44

标签: c++ class static gdb self-contained

大家,

我正在使用OpenFOAM,它就像这样制作了自己的Foam :: string和Foam :: word类型:

(gdb) ptype Foam::word
type = class Foam::word : public Foam::string {
  public:
    static pointer typeName;
    static int debug;
    static const Foam::word null;

  private:
    void stripInvalid(void);
  public:
    word(void);
    word(const Foam::word &);
    word(pointer, bool);
    word(pointer, size_type, bool);
    word(const Foam::string &, bool);
    word(const std::__cxx11::string &, bool);
    word(Foam::Istream &);
    static bool valid(char);
    void operator=(const Foam::word &);
    void operator=(const Foam::string &);
    void operator=(const std::__cxx11::string &);
    void operator=(pointer);
}
(gdb) ptype Foam::string
type = class Foam::string : public std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > {
  public:
    static pointer typeName;
    static int debug;
    static const Foam::string null;

    string(void);
    string(const std::__cxx11::string &);
    string(pointer);
    string(pointer, size_type);
    string(char);
    string(Foam::Istream &);
    size_type count(char) const;
    bool match(const std::__cxx11::string &) const;
    Foam::string & replace(const Foam::string &, const Foam::string &, size_type);
    Foam::string & replaceAll(const Foam::string &, const Foam::string &, size_type);
    Foam::string & expand(bool);
    bool removeRepeated(char);
    Foam::string removeRepeated(char) const;
    bool removeTrailing(char);
    Foam::string removeTrailing(char) const;
    Foam::string operator()(size_type, size_type) const;
    Foam::string operator()(size_type) const;
    static bool stripInvalid<Foam::word>(Foam::string &);
    static bool stripInvalid<Foam::fileName>(Foam::string &);
    static bool valid<Foam::word>(const Foam::string &);
    static bool valid<Foam::fileName>(const Foam::string &);
}

现在,可以像这样打印Foam::string::null

(gdb) p Foam::string::null
$82 = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "",
    static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}}

然而,当谈到Foam::word::null时,gdb将产生无限的递归输出,如下所示:

(gdb) p Foam::word::null
$83 = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
    static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
  static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
      static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
    static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
        static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
      static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
          static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
        static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
            static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
          static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
              static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
            static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
                static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
              static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
                  static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
                static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
                    static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
                  static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
                      static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
                    static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
                        static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
                      static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
                          static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
                        static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
                            static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
                          static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
                              static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
                            static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0,
                                static null = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string", static debug = 0, static null = <same as static member of an already seen type>}},
                              static typeName = 0x7ffff4e398eb "word", static debug = 0, static null = {<Foam::string> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", static typeName = 0x7ffff4e38b8a "string",

我的问题是:

gdb中这种c ++类结构有什么问题,以及如何打印出更好的结果。

谢谢!

2 个答案:

答案 0 :(得分:5)

你可以试试这个:

<p:selectOneMenu        id          = "activeTin"
                        panelStyle  = "width:280px"
                        effect      = "fade"
                        var         = "t" 
                        value       = "#{homeBean.value}"
                        itemValue   =  "#{data}">

               <p:ajax  process     =  "@this" 
                        event       =  "change" 
                        listener    =  "#{homeBean.changeActiveTin}"  
                        update      =  "@this"/>

           <f:selectItems value     = "#{homeBean.valueList}" 
                          var       = "data"
                          itemLabel ="#{data.companyTinId}"></f:selectItems> 
</p:selectOneMenu> 

这会导致更易于管理的输出,因为递归是通过静态成员发生的。或者,您可以为该类型编写Python pretty-printer,但这当然更为复杂。

答案 1 :(得分:1)

我刚用eclipse遇到了这个问题,导致调试会话无声崩溃。 这确实很糟糕,'设置打印静态成员'是一种解决方法,但不是一个可行的解决方案