从C文件中提取结构成员名称

时间:2014-09-01 09:25:09

标签: windbg

我正在编写一个windbg扩展来使用ExtRemoteData打印结构的内容。我发现当结构发生变化时,我需要不断更改代码。

相反,我认为如果我可以直接读取C文件并解析我的结构以获取结构成员名称,那将更灵活。

是否有工具/功能我可以读取C文件,并枚举我的结构的各种元素? 内部的C编译器正在这样做,但我不确定如何提取该信息。

喜欢的东西 Tool.exe 名称值对将包含诸如的信息 {(membername1,type1),(membername2,type2)....(membernameN,typeN)}

4 个答案:

答案 0 :(得分:1)

这里需要进行更多的研究,但作为一种捷径,您可能需要考虑像python这样的脚本语言来进行解析,这意味着可以执行您想要执行的操作的python库。 parsing C code using python

现在,将python与windbg集成为已经可用的结帐http://pykd.codeplex.com/

答案 1 :(得分:0)

类型信息通常包含在PDB(程序数据库)符号文件中。有公共符号和私人符号。您可能需要私有符号才能获得所需的所有信息。

您不仅可以为调试版本生成私有PDB,还可以为发布版本生成私有PDB。它应该只是首选IDE中的设置。

拥有私人符号后,您可以使用DbgHelp API阅读。取决于您已有的信息,例如SymFromName()听起来很有用。

虽然解析C文件也可能是一个选项,但请注意源代码文件可能已经更改,但编译的DLL和PDB没有。

答案 2 :(得分:0)

我不确定它是否适合windbg。但是有人提供了使用pykd的方法。因此,我提到一种提取元数据并将其加载到python中的方法。

我在C / C ++源文件中使用了SWIG tool to extract the CSV metadata

假设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().

现在很容易用cutawkpython来解析CSV文件。

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

答案 3 :(得分:0)

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') )