Найти участника по смещению

У меня есть (большой) класс и смещение в этом классе.
Как я могу эффективно найти член, определенный по этому смещению?

Пример:

struct Dummy {
int a, b, c;
}

Учитывая смещение 4 и предполагая sizeof(int) == 4Я хотел бы получить «б».

Очевидно, я не хотел бы делать это во время выполнения, поэтому я играл с nm, objdump а также gdb какое-то время, но не удается это сделать.

0

Решение

Была такая же проблема ранее сегодня,

Самый подходящий инструмент, который я могу найти, это 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, чтобы автоматизировать это, это довольно утомительно, независимо от того, что я делаю …

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]