Найти элемент по смещению

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

Пример:

struct Dummy {
    int a, b, c;
}

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

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


person mbschenkel    schedule 13.11.2015    source источник
comment
В C++ нет отражения, но вы можете вручную сравнить offesetof каждый член с вашим заданным значением, при условии, что ваш класс имеет стандартную компоновку.   -  person Kerrek SB    schedule 13.11.2015
comment
@KerrekSB: Ну, для небольшого класса это возможно, но у меня есть буквально сотни членов, контейнеров STL и т. д. Я ожидал, что компилятор или другой инструмент сможет просто выгрузить внутреннюю структуру, включая смещения.   -  person mbschenkel    schedule 13.11.2015
comment
stackoverflow.com/questions/13180842/   -  person Unimportant    schedule 13.11.2015
comment
@user1320881: Спасибо, но я хочу сделать наоборот.   -  person mbschenkel    schedule 13.11.2015
comment
Могу я спросить, почему вы пытаетесь это сделать?   -  person Anon Mail    schedule 13.11.2015
comment
@AnonMail: я знаю, что в некоторых случаях конкретное значение не инициализируется, и хочу знать, что это такое. Кроме того, инструмент должен легко сообщать мне структуру класса.   -  person mbschenkel    schedule 13.11.2015
comment
Можете ли вы использовать редактор для поиска имени участника? В противном случае вам понадобятся std::map, имена переменных и смещения членов.   -  person Thomas Matthews    schedule 13.11.2015
comment
Хороший инструмент статического анализа покажет вам все неинициализированные переменные.   -  person Thomas Matthews    schedule 13.11.2015
comment
@mbschenkel Думаю, в этом случае вам поможет отладчик.   -  person Anon Mail    schedule 13.11.2015
comment
@AnonMail: Я бы тоже так подумал, просто я не нашел удобного способа сделать это, поэтому, если вы это сделаете, дайте мне знать!   -  person mbschenkel    schedule 13.11.2015
comment
Как насчет использования подходящего диагностического инструмента, такого как ASAN, для поиска ошибок с неинициализированными значениями?   -  person Kerrek SB    schedule 13.11.2015
comment
@kerreksb спасибо за указание на статический анализ, однако мы уже используем его. Это немного более сложный случай, и мне также просто любопытно, как проверять конструкции в любом случае.   -  person mbschenkel    schedule 13.11.2015


Ответы (1)


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

Наиболее подходящий инструмент, который я могу найти, это 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