代码之家  ›  专栏  ›  技术社区  ›  Adam

GDB不在GHS编译的ELF中列出成员函数或命名空间函数

  •  0
  • Adam  · 技术社区  · 8 年前

    我试图使用GDB调试由Green Hills GHS编译器从C++源代码编译的PowerPC ELF映像。GHS多重调试器使用专有的调试格式,但编译器也提供了一个-dwarf2选项来生成本机DWARF-2调试信息。GDB至少能够从DWARF-2中读取一些信息,可以将行号映射到地址并找到符号的地址,但在成员函数中打印局部变量等许多事情都不起作用。

    我用以x86为目标的g++和以PowerPC为目标的GHS编译了这个非常简单的程序,以比较两者。在顶层设置了-dwarf2和-G标志。GHS的gpj生成DWARF-2调试信息。我做了一个 readelf --debug-dump 并证实GHS确实产生了看起来相当正确的DWARF-2。

    class ClassA {
    public:
      int Method(bool arg) {
        int local_1 = arg * 2;
        member_var_ = local_1;
        return local_1;
      }
      int member_var_;
    };
    
    int FuncA(int arg) {
      int local_2 = arg * 2;
      return local_2;
    }
    
    double global_a = 1;
    
    namespace NamespaceA {
      int FuncB(int arg) {
        int local_3 = arg * 2;
        return local_3;
      }
    }
    
    int main(int argc, char *argv[]) {  
      ClassA a;
      return a.Method(true);
    }
    

    GDB能够列出g++编译的ELF中的所有函数:

    gdb hello
    ...
    Reading symbols from hello...done.
    (gdb) info func
    All defined functions:
    
    File hello.cc:
    int ClassA::Method(bool);
    int FuncA(int);
    int NamespaceA::FuncB(int);
    int main(int, char**);
    

    GDB不列出成员函数或GHS编译的ELF中在命名空间内声明的函数:

    gdb hello
    ...
    Reading symbols from hello...done.
    (gdb) info func
    All defined functions:
    
    File src/hello.cc:
    int FuncA(int);
    int main(int, char**);
    
    Non-debugging symbols:
    ...
    

    GHS生成的DWARF-2和GDB之间是否存在不相容性?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Community Mohan Dere    5 年前

    对于名称空间支持,您至少需要DWARF3格式。看起来DWARF2无法表示C++名称空间,因为它是在考虑C++名称空间之前完成的,请参阅 DWARF3 features :

    3大新功能

    3.1 C++,包括名称空间

    DWARF2在C++标准之前完成,甚至在考虑C++名称空间之前完成。矮人3 使用DW TAG名称空间DW TAG提供一整套功能 导入的声明、导入时的DW和启用 在中正确表示可见名称空间的实现 每个功能。实现可以选择发出单个命名空间 在 编译单元,虽然它会丢失一些 C++命名空间的一些用法的详细信息。