Была такая же проблема ранее сегодня,
Наиболее подходящий инструмент, который я могу найти, это pahole. Пример использования:
$ cat dummy.cpp
#include <string>
struct Dummy {
int a, b, c;
std::string d;
};
struct Dummy x; // gcc doesn't emit debug info for unused stuff
$ g++ -c dummy.cpp -ggdb3
$ pahole dummy.o
die__process_class: tag not supported (template_type_parameter)!
//trimmed structs __va_list_tag, tm and lconv
struct Dummy {
int a; /* 0 4 */
int b; /* 4 4 */
int c; /* 8 4 */
string d; /* 16 8 */
//trimmed some constructors
};
К сожалению, он не печатает содержимое шаблона, например std::string aka std::basic_string‹ char>.
Я также нашел pstruct (проще запутать, чем pahole, не принимает С++ вообще), Clang -cc1 -fdump-record-layouts (это дало мне кучу указателей на адресное пространство Clang, но без смещений) и MSVC -d1reportAllClassLayout (этот флаг не имел значения, когда я пытался).
Или ручной метод:
Memустановите структуру в ноль, установите соответствующие смещения в 0xFF, напечатайте структуру в gdb (используйте set print pretty on
, чтобы не помещать все в одну огромную строку), выведите вывод для ненулевых значений и надейтесь, что красивые принтеры STL этого не сделают. слишком запутаться.
Может быть, я должен сделать модуль GDB, чтобы автоматизировать это, это довольно утомительно, независимо от того, что я делаю...
person
Alcaro
schedule
24.03.2017
offesetof
каждый член с вашим заданным значением, при условии, что ваш класс имеет стандартную компоновку. - person Kerrek SB   schedule 13.11.2015std::map
, имена переменных и смещения членов. - person Thomas Matthews   schedule 13.11.2015