Дамп c-структуры похож на gcc, но как вызываемая c-функция

У меня много c-структур (содержащих подструктуры, содержащие объединения, содержащие подструктуры ...)), и я хотел бы распечатать их так же, как это может сделать gcc.

Поэтому я не хочу делать то, что описано в Как мне выгрузить произвольную структуру в C?, потому что это просто шестнадцатеричный дамп

и я также не хочу изобретать какой-то самоанализ (например, java / современный c ++), но просто хочу использовать знания, которые gcc имеет / генерирует для gdb, и добавить некоторые знания, которые у меня есть (например, как выбрать правильный вариант объединения )

как предлагается в Linux C: Простой и "красивый" дамп / распечатка структур (как в gdb) - из исходного кода?.

Итак, мой план таков: возьмите весь этот хороший c-код, который у меня есть, позвольте gcc поработать над ним и создать некоторую метаинформацию, которая на втором этапе анализируется / анализируется чем-то, что затем может интерпретировать / распечатать часть память согласно этой информации.

В Linux есть утилита под названием pstruct / c2ph, которая делает нечто подобное и, кажется, имеет некоторый уровень знаний, который можно изменить, чтобы делать то, что я хочу.

Итак, в основном я ищу инструмент, который принимает файл, содержащий

struct X {
   int a;
   char *b;
 }

и создает функцию lile printX (void * p); который затем печатает что-то вроде {a: 1, b: "lala"}, если p указывает на соответствующий X

Так есть ли что-то, что уже может это сделать? Такое ощущение, что структура очень близка ...


person pbhd    schedule 03.04.2014    source источник
comment
Если у вас уже есть структуры в каком-либо анализируемом формате, вы можете просто использовать sed для создания функций печати для каждой из них. Становится лучше, если вы используете в них универсальные шаблоны C11, возможно, в результате вы получите универсальную функцию печати.   -  person Gábor Buella    schedule 04.04.2014
comment
Humpfa. У меня есть только c, который, конечно, можно разобрать, но это настоящая c-программа с включениями, определениями и всем остальным, поэтому утилита должна каким-то образом действовать в том же классе, как компилятор ...   -  person pbhd    schedule 04.04.2014
comment
Вы думаете о Perl c2ph, который когда-то был производным от программы-предшественника pstruct?   -  person Jonathan Leffler    schedule 04.04.2014
comment
точно. У меня такое чувство, что его можно модифицировать, чтобы делать то, что мне нужно, но, может быть, что-то подобное уже существует ...   -  person pbhd    schedule 04.04.2014
comment
Идея sed мне до сих пор кажется забавной, только нужно работать после препроцессора, до компилятора. Это действительно должно быть достаточно анализируемым, также было бы несложно обрабатывать typedef и игнорировать квалификаторы, такие как const, volatile и т. Д.   -  person Gábor Buella    schedule 04.04.2014
comment
Я не хочу отговаривать sed, мне нравится этот инструмент, но я думаю, что он не справится, например, вложение структур достаточно общим способом.   -  person pbhd    schedule 04.04.2014
comment
Что ж, печально. В любом случае, как насчет попытки атаковать его через yacc / bison stackoverflow.com/questions/2721071/; lysator.liu.se/c/ANSI-C-grammar- y.html Это все равно потребует некоторого кодирования, но вам нужно будет обрабатывать только структуры и игнорировать другие вещи.   -  person Gábor Buella    schedule 04.04.2014


Ответы (1)


Лучший и наиболее точный подход - полагаться на интерфейс плагина компилятора, например, предоставляемый clang и gcc. По сути, компилятор будет вызывать обратные вызовы, предоставленные вашим плагином, для каждого интересного события (например, при обнаружении объявлений), давая вам возможность создать необходимые оболочки / метаданные.

Альтернативные подходы включают такие инструменты, как gcc-xml (который будет создавать xml-представление вашей программы), swig и любые инструменты, способные анализировать вывод отладки DWARF (это то, что использует gdb).

person oakad    schedule 04.04.2014
comment
Спасибо за эту информацию, в настоящее время я занимаюсь изучением функции плагина gcc, думаю, это поможет ... - person pbhd; 05.04.2014