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

Windbg 从C文件中提取结构成员名称,windbg,Windbg,我正在编写windbg扩展,以使用ExtRemoteData打印结构的内容。我发现当结构发生变化时,我需要不断地修改代码 相反,我认为如果我可以直接读取C文件并解析我的结构以获得结构成员名称,那么会更加灵活 是否有一个工具/函数可以读取C文件,并列举我的结构的各种元素? C编译器内部正在这样做,但我不确定如何提取这些信息 差不多 Tool.exe 名称-值对将包含以下信息: {(NealNAME1,Type 1),(NealNAME2,Type 2)…(BeNAMEN,Type)}< P>这里需

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

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

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

差不多 Tool.exe 名称-值对将包含以下信息:
{(NealNAME1,Type 1),(NealNAME2,Type 2)…(BeNAMEN,Type)}

< P>这里需要更多的研究,但是作为一种快捷方式,您可能需要考虑像Python这样的脚本语言来进行解析,这是指Python库,它可以做你想做的事情。


现在是将python与windbg集成为一个已经可用的扩展的部分。签出类型信息通常包含在PDB(程序数据库)符号文件中。有公共符号和私人符号。您可能需要私人符号来获取所需的所有信息

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

一旦你们有了私人符号,你们就可以用它来阅读了。根据您已有的信息,例如,听起来有用


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

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

我使用了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().
现在,使用
cut
、或
awk
python
解析CSV文件(如果需要)变得很容易

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

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

这些信息都包含在私人PDB中,你可以通过它阅读,听起来更像我想要的。谢谢你,托马斯!不客气。我已经给出了这个答案(更详细一点),这样问题就可以标记为已解决。这是新的,谢谢!尽管我更喜欢使用DbgHelp之类的东西,但这将有助于直接从用C/C++编写的扩展中读取它。