首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C结构内存布局的可视化

C结构内存布局的可视化
EN

Stack Overflow用户
提问于 2016-03-11 09:32:40
回答 3查看 2.1K关注 0票数 1

我目前正在从事一个C项目,该项目与其他程序集代码有很大的接口。我们正在使用自制的控制块和结构的可视化,我锁定了一个如何自动化这个过程的过程。

由于我们对每个组装控制块都有一个C结构等效,而且我们正在为一个非常罕见的体系结构编程,所以最简单的方法可能是可视化C结构。

我或多或少地在寻找一种方法,从TCP wiki页面自动获得"TCP伪校验和计算(IPv6)伪头“这样的图形:

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

遗憾的是,我还没有发现任何开源工具能够从C头文件中生成这样的可视化。是否有一种方法可以生成这样的图像或html表示而无需手动编写它们?

编辑:由于Alexey的想法,有了实用工具,就有可能从对象文件的矮小部分提取所有使用过的结构的真正内存布局。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-11 09:37:44

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

UPD:从未尝试过,但有pycparser解析器,这可能很有用。

票数 3
EN

Stack Overflow用户

发布于 2016-03-11 09:38:52

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2018-05-10 22:00:30

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

(它也是一种编程语言,它使用这种Dwarf理解能力直接访问库/程序内部,在运行时使用零粘合代码或链接。)

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

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

要绘制一个项的关系图,所需要的就是按名称引用它(如果它不在堆栈上),然后用“堆栈!”调用堆栈函数!(它通过名称引用函数“堆栈”,然后通过"!“对其进行计算。)(操作员)

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

代码语言:javascript
复制
j2> loadlib([test/build/libtestlib.so]) @testlib

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

代码语言:javascript
复制
j2> testlib.teststruct

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

代码语言:javascript
复制
j2> stack!

包含在/tmp/VMRES_STACK.dot中的图形可以通过许多图形/点查看器中的任意一个显示,例如xdot:

代码语言:javascript
复制
bash> xdot /tmp/VMRES_STACK.dot

STACK.dot

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35936526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档