【问题标题】:How to visualise a graph of C structs that contain / point to one another?如何可视化包含/指向彼此的 C 结构图?
【发布时间】:2011-04-24 17:30:56
【问题描述】:

我正在使用 Ubuntu 10.04,并且正在学习内核对象的编程。

我遇到了一些我难以阅读的相当复杂的结构,所以我想我会尝试找到一些可以帮助我将它们可视化的工具。

目前我能找到的只有VCG,它有一个C Struct Visualization Example,看起来像这样:

这看起来像是我想使用的东西。

首先,为 Ubuntu 打包的最后一个 VCG 是 vcg (1.30debian-6) in hardy - 但是可以在 Ubuntu Lucid 中下载和安装 .deb 包没有问题。

但是,这个包似乎只是一个 VCG 查看器(我猜类似于vcgviewer)。 vcgviewer页面备注:

To generate compiler graph data with newest gcc compilers use:
gcc -g -da -dv -fdump-tree-original-raw -fdump-tree-all-all 

所以,显然我必须在编译时将这些开关与gcc 一起使用,以从 C 源代码生成 .vcg 图形文件。

然而,问题是我正在构建一个内核模块,它只引用 Linux 头文件 - 因为我尽量避免重新编译整个内核。看来,一旦我尝试在该上下文(内核模块)中使用-fdump-tree-... 开关,gcc 也想开始编译内核的其余部分! (显然在编译和生成 .vcg 图时都失败了 - 因为我没有内核源代码,只有标题

所以我的问题是 - 是否有一种工具可以生成 .vcg 或 .dot 结构图 - 只需使用纯文本头文件作为输入? (它不必解决所有依赖关系 - 只需解决同一目录中头文件中的那些依赖关系

编辑:后端是 .vcg 或 .dot 实际上对我来说并不重要,我之所以提到它们只是因为到目前为止我已经找到了它们;无论后端如何,任何允许类似结构可视化的软件都是受欢迎的 :)

PS:请注意,如果您不想使用 VCG 查看器查看 .vcg 图形,您可以将 .vcg 格式转换为 .dot 格式,并使用graphviz 代替进行可视化。对我有用的是将graph-easy - search.cpan.org 用于perl - 它首先被打包在 Ubuntu 的 Maverick 版本中,如 libgraph-easy-perl但是,.deb 文件可以 - 再次 - 下载和安装没有问题清醒)。 libgraph-easy-perl 安装 graph-easy 脚本,然后允许执行以下操作:

graph-easy test.vcg --as_dot | dot -Tpng -o test.vcg.png 

另请参阅“[graphviz-interest] VCG files”和“Diego Novillo - Re: can't find VCG viewer”以获取另一个 vcg-to-dot 脚本(很遗憾,它对我不起作用)。

【问题讨论】:

    标签: c linux struct visualization


    【解决方案1】:

    我在使用doxygen 完成该任务方面有很好的经验。它旨在从带注释的源文件中创建文档,但它已经可以在没有注释的情况下为您提供很多东西,包括各种图形。 Doxygen 使用点来创建图形。

    【讨论】:

    • 嗨,巴特,感谢您的回复!这个 SO 页面:Open-source tool to visualize C/C++ header file dependencies? - Stack Overflow 对 doxygen 有一个很好、快速的介绍 - 但它似乎需要一些混乱:) 另外,编辑了我的问题,所以很明显我不需要 dot 或特定的后端;任何基于源文件可视化结构的工具都可以。干杯!
    • @sdaau:强大的工具总是需要一些工作才能让它们完全按照您的意愿行事,特别是如果这不是它们设计的默认用途。 Doxygen 内部使用 dot,但其输出是可直接查看的图像文件。
    • 嗨巴特 - 只是提一下:我完全同意:需要一些工作!如果有任何替代方案,我只是在徘徊,这可能更适合这项任务:) ...感谢您的评论 - 干杯!
    【解决方案2】:

    通过执行以下操作,我成功地构建了一个带有 vcg 生成的内核模块:

    1. 使用cp -al /usr/src/linux-srcdir /tmp/tmp-srcdir 创建内核源代码或头目录的链接副本,因为 gcc 想要写入当前工作目录。
    2. EXTRA_CFLAGS="-g -da -dv -fdump-tree-original-raw -fdump-tree-all-all" 添加到make 命令行,例如。 -C /tmp/tmp-srcdir M=pwdEXTRA_CFLAGS="-g -da -dv -fdump-tree-original-raw -fdump-tree-all-all"vcg 文件在/tmp/tmp-srcdir 中生成

    【讨论】:

    • 您好 Hasturkun,感谢您的评论!不幸的是,看起来这个过程需要完整的内核源代码——只是头文件是不行的。首先,请注意我同时拥有linux-headers-2.6.32-25linux-headers-2.6.32-25-generic;在generic 上执行cp -al 时,make 将失败并显示Makefile: No such file or directory。复制简单的标题后,我首先得到了ERROR: Kernel configuration is invalid... Run 'make oldconfig && make prepare' on kernel src to fix it.。对我来说,make oldconfig 通过了,但make prepareNo rule to make target kernel/bounds.c` 吐了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多