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

Пиша разширение windbg за отпечатване на съдържание на структура, използвайки ExtRemoteData. Виждам, че трябва да продължа да променям кода си, както и когато структурата се промени.

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

Има ли инструмент/функция, с която мога да чета C файл и да изброявам различните елементи на моята структура? Вътрешният C компилатор прави това, но не съм сигурен как мога да извлека тази информация.

Нещо като двойки стойности на имена на Tool.exe ще съдържа информация като {(име на член1,тип1),(име на член2,тип2).... (име на членN,типN)}


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