[英]Visualisation of the memory layout of C structs
我目前正在开发一个与其他汇编代码密切接口的C项目。 我们正在使用我们正在使用的控制块和结构的自制可视化,并且我正在锁定有关如何自动执行此过程的过程。
由于我们对每个程序集控制块都有一个C结构等价,并且我们正在编写一个非常罕见的架构,最简单的方法可能是可视化C结构。
我或多或少都在寻找一种方法来自动获取TCP wiki页面中的“校验和计算的TCP伪报头(IPv6)”等图形:
遗憾的是,我还没有找到任何能够从C头文件生成这种可视化的开源工具。 有没有办法生成这样的图像或HTML表示而无需手动编写它们?
编辑:感谢Alexey Frunze的想法,使用实用程序pahole,可以从目标文件的DWARF部分提取所有使用的结构的实际内存布局。
其中一种方法是使用这些结构编译C代码,并从对象/可执行文件的调试信息中提取结构信息。 否则你正在寻找/制作结构解析器或黑客铿锵声。
UPD :没试过,但有pycparser ,这可能有用。
我正在开发一个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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.