繁体   English   中英

可视化C结构的内存布局

[英]Visualisation of the memory layout of C structs

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

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

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

用于校验和计算的TCP伪报头(IPv6)

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

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

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

UPD :没试过,但有pycparser ,这可能有用。

由于数据结构对齐约束(特定ABI需要),某些C聚合( structunion ,array)的布局是特定于实现的

您可以使用调试器(例如gdb ptype命令)。 请注意, ddd具有图形显示。

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

我正在开发一个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM