我正在尝试使用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之间是否存在不兼容性?
答案 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 ++命名空间的一些用法的详细信息。