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