我试图使用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之间是否存在不相容性?