C结构的内存布局可视化

6tr1vspr  于 9个月前  发布在  其他
关注(0)|答案(4)|浏览(88)

我目前正在做一个与其他汇编代码有大量接口的C项目。我们正在使用自制的控制块和结构的可视化,我正在锁定一个如何自动化这个过程的过程。
由于我们对每个汇编控制块都有一个C结构体等效,并且我们正在为一个非常罕见的架构编程,最简单的方法可能是可视化C结构体。
我或多或少地在寻找一种方法来自动从TCP wiki页面获取像“TCP pseudo-header for checksum computation(IPv6)”这样的图:
TCP pseudo-header for checksum computation (IPv6)
遗憾的是,我还没有找到任何开源工具能够从C头文件生成这样的可视化。有没有一种方法可以生成这样的图像或html表示,而无需手动编写它们?
编辑:感谢Alexey Frunze的想法,使用pahole实用程序可以从对象文件的DWARF部分提取所有使用的结构的真实的内存布局。

oyxsuwqo

oyxsuwqo1#

方法之一是用这些结构体编译C代码,并从对象/可执行文件的调试信息中提取结构信息。否则,你就在寻找/制作结构解析器或破解clang。

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

5w9g7ksd

5w9g7ksd2#

一些C聚合(structunion,数组)的布局是 * 实现 * 特定的,因为data structure alignment约束(由特定的ABI要求)。
您可以使用调试器(例如gdbptype命令)。请注意,ddd具有图形显示。
如果你有 * 许多 * 结构,你可以考虑使用MELT定制你的GCC编译器。你将开发你特定的MELT扩展来显示布局。这可能需要几周的时间(因为你需要了解GCC的一些内部机制)。

iswrvxsc

iswrvxsc3#

我正在开发一个C工具箱,它可以绘制任何复杂度的C类型。它可以在用“-g”编译的代码中导入和隐藏Dwarf信息,并且可以以“点”格式转储任何你想要的东西(可以通过任何工具显示)。
(It也是一种编程语言,它使用这种Dwarf理解能力在运行时直接访问库/程序内部,不需要任何粘合代码或链接。
参见:https://github.com/jasonnyberg/j2/wiki/Diagramming-C-types-using-j2
j2系统可以读取和理解Dwarf信息;作为一个调试特性,它还可以以“dot”语言的形式转储您选择的项,这允许以图形形式显示类型信息层次结构。“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

6jygbczu

6jygbczu4#

我来这里寻找一个结构布局可视化工具,并很高兴分享我的发现:https://marketplace.visualstudio.com/items?itemName=RamonViladomat.StructLayout2022-似乎工作得很好。理解结构,工会,缓存行大小.

相关问题