可视化C结构的内存布局

时间:2016-03-11 09:32:40

标签: c parsing struct visualization declaration

我目前正在开发一个与其他汇编代码密切接口的C项目。我们正在使用我们正在使用的控制块和结构的自制可视化,并且我正在锁定有关如何自动执行此过程的过程。

由于我们对每个程序集控制块都有一个C结构等价,而且我们正在编写一个非常罕见的架构,最简单的方法可能就是可视化C结构。

我或多或少都在寻找一种方法来自动获取TCP wiki页面中的“校验和计算的TCP伪报头(IPv6)”等图形:

TCP pseudo-header for checksum computation (IPv6)

可悲的是,我还没有找到任何能够从C头文件生成此类可视化的开源工具。有没有办法生成这样的图像或html表示而无需手动编写它们?

编辑:感谢Alexey Frunze的想法,使用实用程序pahole,可以从目标文件的DWARF部分中提取所有使用的结构的实际内存布局。

3 个答案:

答案 0 :(得分:3)

其中一种方法是使用这些结构编译C代码,并从对象/可执行文件的调试信息中提取结构信息。否则,你正在寻找/制作结构解析器或黑客铿锵。

UPD :从未尝试过,但有pycparser,这可能会有用。

答案 1 :(得分:0)

某些C聚合(structunion,数组)的布局是实现特定的,因为data structure alignment约束(特定{{3}需要}})。

您可以使用调试器(例如ptype的{​​{1}}命令)。请注意gdb有一个图形显示。

如果您有许多结构,则可以考虑使用ABI自定义GCC编译器。您将开发特定的MELT扩展以显示布局。这可能需要数周时间(因为您需要了解一些GCC内部组织)。

答案 2 :(得分:0)

我正在开发一个C工具箱,除其他外,它可以绘制任何复杂性的C类型。它在用“-g”编译的代码中导入和理解Dwarf信息,并且可以以“点”格式(可以通过任意数量的工具显示)转出你想要的任何内容。

(它也是一种编程语言,它使用这种矮人理解能力直接访问库/程序内部,在运行时没有必要的胶水代码或链接。)

请参阅:https://github.com/jasonnyberg/j2/wiki/Diagramming-C-types-using-j2

j2系统可以读取和理解矮人信息;作为调试功能,它还可以以“点”语言的形式转储您选择的项目,这允许以图形形式显示类型信息层次结构。 “stack”函数显示解释器顶层堆栈上的项目,也将这些项目转储到/tmp/VMRES_STACK.dot。

要绘制一个项目,只需要按名称引用它(如果它不在堆栈中),然后使用“stack!”调用堆栈函数。 (它按名称引用函数“stack”,然后通过“!”运算符对其进行求值。)

一旦您运行了解释器(请参阅上面的解释器本身链接以及转储结构图的实际示例运行),您只需要A)“导入”该库:

j2> loadlib([test/build/libtestlib.so]) @testlib

然后B)引用你导入的结构(将它添加到解释器的堆栈中):

j2> testlib.teststruct

最后,C)显示堆栈(文本上,作为副作用,生成文件/tmp/VMRES_STACK.dot):

j2> stack!

/tmp/VMRES_STACK.dot中包含的图表可以通过任何一个graphviz / dot查看器显示,例如xdot:

bash> xdot /tmp/VMRES_STACK.dot

xdot /tmp/VMRES_STACK.dot