![](/img/trans.png)
[英]GDB-Python scripting: any samples iterating through C/C++ struct fields
[英]Extract the fields of a C struct
如果使用debugging( -g
)编译C代码, pahole ( git )可以为您提供所使用的确切结构布局。
$ pahole /bin/dd … struct option { const char * name; /* 0 8 */ int has_arg; /* 8 4 */ /* XXX 4 bytes hole, try to pack */ int * flag; /* 16 8 */ int val; /* 24 4 */ /* size: 32, cachelines: 1, members: 4 */ /* sum members: 24, holes: 1, sum holes: 4 */ /* padding: 4 */ /* last cacheline: 32 bytes */ }; …
解析比直接解析要好得多。
如果C代码包含您在编写正则表达式时没有想到的语法,则会出现令人头疼的问题。 然后你回过头来意识到C不能被正则表达式真正解析,生活变得不那么有趣。
试试它:定义你自己的简单格式,它允许比C更少的技巧,并从你的文件生成C头文件和Python接口代码:
define socketopts
int16 port
int32 ipv4address
int32 flags
然后你可以轻松编写一些Python来将其转换为:
typedef struct {
short port;
int ipv4address;
int flags;
} socketopts;
并且还发出一个Python类,它使用struct
来打包/解压缩三个值(可能有两个是big-endian,另一个是native-endian,由你决定)。
你看过Swig吗?
我已经在相当大的项目中成功使用了GCCXML 。 您将获得C代码(包括结构)的XML表示,您可以使用一些简单的Python对其进行后处理。
我的朋友为这个任务完成了C-parser,他和cog一起使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.