Извлечение имен элементов структуры из файла C

Я пишу расширение Windbg для печати содержимого структуры с использованием ExtRemoteData. Я вижу, что мне нужно продолжать изменять свой код по мере изменения структуры.

Вместо этого я думаю, что было бы более гибко, если бы я мог напрямую читать файл C и анализировать свою структуру, чтобы получить имена элементов структуры.

Есть ли инструмент/функция, с помощью которой я могу прочитать файл C и перечислить различные элементы моей структуры? Компилятор C делает это внутри, но я не уверен, как я могу извлечь эту информацию.

Что-то вроде пары значений имени Tool.exe будет содержать такую ​​​​информацию, как {(membername1, type1), (membername2, type2).... (membernameN, typeN)}


person S__J    schedule 01.09.2014    source источник
comment
Эта информация включена в частные PDB, которые вы можете прочитать через DbgHelp   -  person Thomas Weller    schedule 01.09.2014
comment
Это больше похоже на то, что я хотел. Спасибо Томас!   -  person S__J    schedule 09.09.2014
comment
Пожалуйста. Я дал это как ответ (немного более подробный), чтобы вопрос можно было пометить как решенный.   -  person Thomas Weller    schedule 09.09.2014


Ответы (4)


Здесь необходимы дополнительные исследования, но в качестве ярлыка вы можете рассмотреть языки сценариев, такие как python, для выполнения синтаксического анализа. Следующее относится к библиотеке python, которая может делать то, что вы намереваетесь делать. разбор кода C с использованием python

Теперь идет часть интеграции python с windbg в качестве расширения, которое уже доступно для проверки http://pykd.codeplex.com/< /а>

person Addy    schedule 06.09.2014
comment
Это новинка, спасибо! Хотя я бы предпочел использовать что-то вроде DbgHelp, это поможет прочитать его непосредственно из моего расширения, написанного на C/C++. - person S__J; 09.09.2014

Информация о типе обычно включается в файлы символов PDB (программная база данных). Существуют общедоступные символы и частные символы. Вам могут понадобиться частные символы, чтобы получить всю информацию, которую вы хотите.

Вы можете создавать частные PDB-файлы не только для отладочных сборок, но и для выпускных сборок. Это должен быть параметр только в предпочитаемой вами среде IDE.

Если у вас есть частные символы, вы можете прочитать их с помощью ссылки API DbgHelp. В зависимости от того, какая информация у вас уже есть, например. SymFromName() звучит полезный.

Хотя синтаксический анализ файла C также может быть вариантом, имейте в виду, что файл с исходным кодом мог уже измениться, а скомпилированные библиотеки DLL и PDB — нет.

person Thomas Weller    schedule 09.09.2014

Я не уверен, подходит ли он для windbg. Но кто-то предоставил способ использовать pykd. Поэтому я упоминаю способ извлечения метаданных и загрузки их в python.

Я использовал инструмент SWIG для извлечения метаданных CSV из исходного файла C/C++.

Предположим, что код C содержит структуру, подобную следующей:

class Bike {
public:
    int color;      // color of the bike
    int gearCount;      // number of configurable gear
    Bike() {
        // bla bla
    }
    ~Bike() {
        // bla bla
    }
    void operate() {
        // bla bla
    }
};

Затем он сгенерирует следующие метаданные CSV,

Bike|color|int|variable|public|
Bike|gearCount|int|variable|public|
Bike|operate|void|function|public|f().

Теперь легко разобрать CSV-файл с помощью cut, awk или python, если это необходимо.

import csv
with open('bike.csv', 'rb') as csvfile:
    bike_metadata = csv.reader(csvfile, delimiter='|')
    # do your thing
person shuva    schedule 06.07.2018

pykd имеет встроенный анализатор clang, поэтому он может получать информацию о символах из кода C:

src = '''

class Bike {
public:
    int color;      // color of the bike
    int gearCount;      // number of configurable gear
    Bike() {
        // bla bla
    }
   ~Bike() {
        // bla bla
   }
   void operate() {
       // bla bla
   }
};

'''
#the next print statements will get equal output
print( getTypeFromSource(src, 'Bike') )
print( typeInfo('compiled_module!Bike') )
person ussrhero    schedule 11.07.2018