4

假设我有一个文件system.h,其中包含以下结构

typedef struct Foo {
  int count;
  uint32 world;
  Temp id;
} Foo;

typedef struct Temp {
  uint64 id;
} Temp;

Foo bar;

现在我需要一个宏,类似于DUMP_STRUCT(bar),它递归地打印 bar 的所有成员(类型为 Foo)。

是否有任何解析器/脚本(最好在 php/python 中)可以解析 C 文件或从可执行文件中获取来自 dwarf 的信息并创建类似于的函数DUMP_STRUCT

4

4 回答 4

2

似乎有 libclang 的Python 绑定,它应该能够做你想做的事。还有pycparser项目。

于 2012-04-18T08:37:14.397 回答
1

通过检查pstruct 的工作原理,您可能会有所收获。(我认为它在 perl 中,但使用编译器 stab 调试信息来输出有关结构布局的信息)。

于 2012-06-09T07:54:45.537 回答
1

您可以使用GCCXML,它可以解析 C(有一些限制)和 C++ 标头并以 XML 格式输出。

于 2012-04-18T08:38:57.147 回答
1

如果您的 C 头文件包含 C 头文件包含的典型内容(宏、预处理器条件、包含、位字段),您将需要一个完整的 C 解析器来处理头文件。

在将各种结构槽及其类型转储为 XML 文本的意义上,GCC-XML 可能会产生您需要的东西(它不完全执行“C”,而是执行 C++);您必须在遍历数据结构的代码中对其进行按摩。为此,您可能必须匹配类型声明的子结构(作为有趣形状/内容的 XML 子树)。

我们的DMS 软件工程工具包及其C 前端可进行完整的预处理/解析/构建符号表。您可以从中生成 GCC-XML 的输出,但更容易简单地自定义 DMS 以遍历各种符号表和 AST 以提取您想要的内容。匹配过程更容易,因为符号表旨在方便地访问命名空间的结构、其中的符号条目及其类型信息(已经设置为数据结构)。DMS 还提供表面语法模式匹配,既可以用于识别感兴趣的 AST,也可以用作代码生成器来生成不会出现语法错误的代码。

于 2012-04-18T08:37:56.890 回答