GDB не перечисляет функции-члены или функции пространства имен в скомпилированном GHS ELF.

Я пытаюсь использовать 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?


person Adam    schedule 16.02.2018    source источник


Ответы (1)


Для поддержки пространств имен вам нужен как минимум формат DWARF3. Похоже, что DWARF2 не может представлять пространства имен C++, потому что он был завершен до того, как пространства имен C++ были даже рассмотрены, см. Возможности DWARF3:

3 основных новых функции

3.1 C++, включая пространства имен

DWARF2 был завершен до стандарта C++ и даже до того, как были рассмотрены пространства имен C++. DWARF3 предоставляет полный набор функций, использующих пространство имен DW TAG, импортированное объявление DW TAG, импорт DW AT и расширение DW AT, которые позволяют реализации правильно представлять видимые пространства имен в каждой функции. Реализации могут выбрать одно объявление пространства имен, показывающее полное пространство имен в конце единицы компиляции, поскольку это проще, хотя при этом теряются некоторые детали некоторых применений пространств имен C++.

person ks1322    schedule 17.02.2018
comment
Спасибо за эту информацию. Я не думаю, что отсутствие поддержки пространства имен в DWARF2 является корнем проблемы, которую я вижу. Когда я скомпилировал с g++ и -gdwarf-2, я смог перечислить функцию, объявленную внутри пространства имен. Я не совсем уверен, зачем отладчику вообще знать о пространствах имен. Похоже, что пространство имен просто становится частью полных имен символов. Может быть, это позволит отладчику понять использование директив и псевдонимов пространств имен? - person Adam; 20.02.2018
comment
Я обнаружил, что g++ -gdwarf-2 -gstrict-dwarf генерирует DW_AT_MIPS_linkage_name для пространств имен, понятных gdb. Вероятно, вы можете каким-то образом заставить компилятор GHS также выдавать DW_AT_MIPS_linkage_name. - person ks1322; 21.02.2018
comment
Теперь я думаю, что ты был прав. Оказывается, компилятор Green Hills выдает DIE пространств имен, но идентификатор тега не соответствует тому, что выдает g++ для пространств имен. Пространство имен DIE является родителем всего в пространстве имен. Когда GDB встречает тег, он ничего о нем не знает, просто игнорирует его. Мне удалось исправить GDB, чтобы он автоматически преобразовывал идентификатор тега пространства имен GHS при чтении DWARF-2. Теперь я могу видеть все, что объявлено в пространствах имен. - person Adam; 02.03.2018