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

时间:2018-02-16 23:42:42

标签: gdb cross-compiling powerpc dwarf

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

我编译了这个非常简单的程序,其中g ++以x86为目标,GHS以PowerPC为目标,比较两者。 -dwarf2和-G标志设置在顶级.gpj中,以便GHS生成DWARF-2调试信息。我做了一个df1 = instance1.write_method(...)并确认GHS确实生成了看似合理正确的DWARF-2。

readelf --debug-dump

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

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没有列出成员函数或在GHS编译的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**);

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

1 个答案:

答案 0 :(得分:2)

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

  

3个主要新功能

     

3.1 C ++,包括命名空间

     

DWARF2在C ++标准之前完成,甚至在考虑C ++命名空间之前完成。的Dwarf3   使用DW TAG命名空间DW TAG提供一整套功能   导入的声明,DW AT导入和启用的DW AT扩展   正确表示可见命名空间的实现   每个功能。实现可以选择发出单个命名空间   声明在结尾显示完整的命名空间   编译单元,因为它更简单,虽然它失去了一些   C ++命名空间的一些用法的详细信息。