У меня есть (большой) класс и смещение в этом классе.
Как я могу эффективно найти член, определенный по этому смещению?
Пример:
struct Dummy {
int a, b, c;
}
Учитывая смещение 4
и предполагая sizeof(int) == 4
Я хотел бы получить «б».
Очевидно, я не хотел бы делать это во время выполнения, поэтому я играл с nm
, objdump
а также gdb
какое-то время, но не удается это сделать.
Была такая же проблема ранее сегодня,
Самый подходящий инструмент, который я могу найти, это 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< символ>.
Я также нашел pstruct (проще путать, чем pahole, вообще не принимает C ++), Clang -cc1 -fdump-record-layout (он дал мне кучу указателей на адресное пространство Кланга, но без смещений) и MSVC -d1reportAllClassLayout (этот флаг не имел значения, когда я пытался).
Или ручной метод:
Memset для структуры в ноль, установить соответствующие смещения в 0xFF, распечатать структуру в GDB (используйте set print pretty on
так что он не помещает все в одну огромную строку), подберите вывод для ненулевых и надеюсь, что симпатичные принтеры STL не слишком запутаются.
Может быть, я должен сделать модуль GDB, чтобы автоматизировать это, это довольно утомительно, независимо от того, что я делаю …
Других решений пока нет …