Я пытаюсь использовать GDB для отладки образа PowerPC ELF, скомпилированного компилятором Green Hills GHS из исходного кода C++. Отладчик GHS MULTI использует проприетарный формат отладки, но компилятор предоставляет опцию -dwarf2 для создания собственной отладочной информации DWARF-2. GDB может считывать по крайней мере некоторую информацию из DWARF-2 и может делать такие вещи, как сопоставление номеров строк с адресами и поиск адресов символов, но многие вещи, такие как печать локальных переменных в функциях-членах, не работают.
Я скомпилировал эту очень простую программу с g++ для x86 и GHS для PowerPC, чтобы сравнить их. Флаги -dwarf2 и -G были установлены в файле .gpj верхнего уровня для GHS для получения отладочной информации 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:
...
Есть ли несовместимость между DWARF-2, сгенерированным GHS, и GDB?