我正在编写一个windbg扩展来使用ExtRemoteData打印结构的内容。我发现当结构发生变化时,我需要不断更改代码。
相反,我认为如果我可以直接读取C文件并解析我的结构以获取结构成员名称,那将更灵活。
是否有工具/功能我可以读取C文件,并枚举我的结构的各种元素? 内部的C编译器正在这样做,但我不确定如何提取该信息。
喜欢的东西 Tool.exe 名称值对将包含诸如的信息 {(membername1,type1),(membername2,type2)....(membernameN,typeN)}
答案 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().
现在很容易用cut
或awk
或python
来解析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') )