как найти все объекты (объекты класса / структуры) исполняемого файла C ++ - PullRequest
1 голос
/ 21 марта 2012

Есть ли способ, может быть, с помощью nm или gdb, который позволит мне создать список всех типов объектов, которые содержит исполняемый файл?

Чтобы уточнить, у меня есть исходный код.Мне нужен метод для определения всех размеров классов / структур, которые используются во время выполнения.Так что это, вероятно, проблема из двух частей:

  1. создать список всех классов / структур
  2. использовать sizeof () для каждого из элементов в списке в gdb.

Ответы [ 3 ]

9 голосов
/ 21 марта 2012

«Типы» не являются свойством машинного кода. Это свойство высокоуровневого абстрактного языка , который скомпилирован в машинный код. Если компилятор не примет особых мер для вас, чтобы восстановить информацию об исходной программе, информация о типах обычно вообще не существует.

2 голосов
/ 21 марта 2012

http://www.hex -rays.com / products / ida / index.shtml : декомпилятор для C ++

Обычно вы не получите хороший C ++ из двоичного файла, если вы не скомпилировали его в отладочной информации. Приготовьтесь потратить много ручного труда, изменив код.

Если вы не удалили двоичные файлы, есть некоторая надежда, так как IDA Pro может сгенерировать C-подобный код для работы с вами.

0 голосов
/ 15 августа 2018

Получить список типов из gdb легко.Вы просто хотите info types, а затем ptype, если хотите углубиться в тип (ограничив его типами, совпадающими со строкой, просто чтобы оставить это маленьким):

(gdb) info types Q
All types matching regular expression "Q":

File foo.cpp:
Qq;
(gdb) ptype Qq
type = class Qq {
  private:
    int qx;

  public:
    Qq(int);
    std::__cxx11::string something(std::__cxx11::list<int, std::allocator<int> >);
    int getQ(void);
}

И sizeof говорит вам, насколько великструктура (конечно, это сама структура, так что это может быть, а может и не быть настолько полезным):

(gdb) p sizeof(Qq)
$1 = 4
(gdb) 

Возможно, вы захотите запустить gdb в скрипте и как-то проанализировать вывод.

...