博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用CodeViz绘制函数调用关系图(call graph)
阅读量:4121 次
发布时间:2019-05-25

本文共 1384 字,大约阅读时间需要 4 分钟。

CodeViz是《》(,在页尾)的作者 写的一款分析C/C++源代码中函数调用关系的open source工具(类似的open source软件有 、)。其基本原理是给 GCC 打个补丁,让它在编译时每个源文件时 dump 出其中函数的 call graph,然后用 Perl 脚本收集并整理调用关系,转交给绘制图形。

CodeViz 原本是作者用来分析 Linux virtual memory 的源码时写的一个小工具,现在已经基本支持 C++ 语言,最新的 1.0.9 版能在 Windows + Cygwin 下顺利地编译使用:)。需要注意的是:1) 下载 GCC 3.4.1 的源码 放到 codeviz-1.0.9/compilers,2) 安装 patch 程序(属于Utils类),3) 从 下载并安装 Graphviz 2.6。

我用 CodeViz 分析《嵌入式实时操作系统 uC/OS-II (第二版)》中的第一个范例程序,步骤如下:

1. 想办法让 gcc 能编译uC/OS 2.52和范例程序的源码,每个C源文件生成对于的.c.cdepn文件。只要编译(参数 -c)就行,无需连接。

2. 调用genfull生成full.graph,这个文件记录了所有函数在源码中的位置和它们之间的调用关系。

3. 使用gengraph生成我关心的函数的调用关系。

首先分析main():

1. gengraph --output-type gif -f main

分析main()的call graph,得到的图如下,看不出要领:

2. gengraph --output-type gif -f main -s OSInit

暂时不关心OSInit()的内部实现细节(参数 -s),让它显示为一个节点。得到的图如下,有点乱,不过好多了:

3. gengraph --output-type gif -f main -s OSInit -i "OSCPUSaveSR;OSCPURestoreSR"

基本上每个函数都会有进入/退出临界区的代码,忽略之(参数 -i)。得到的图如下,基本清楚了:

4. gengraph --output-type gif -f main -s "OSInit;OSSemCreate" -i "OSCPUSaveSR;OSCPURestoreSR" -k

OSSemCreate()的内部细节似乎也不用关心,不过保留中间文件sub.graph(参数 -k),得到的图如下,

5. dot -Tgif -o main.gif sub.graph

修改sub.graph,使图形符合函数调用顺序,最后得到的图如下,有了这个都不用看代码了:)

接着分析OSTimeDly()的被调用关系

gengraph --output-type gif -r -f OSTimeDly

看看哪些函数调用了OSTimeDly(),参数 -r ,Task()和TaskStart()都是用户编写的函数:

最后看看Task()直接调用了哪些函数:

gengraph --output-type gif -d 1 -f Task

只看从Task出发的第一层调用(参数 -d 1):

在分析源码的时候,把这些图形打印在手边,在上面做笔记,实在方便得很。

转载地址:http://uhvpi.baihongyu.com/

你可能感兴趣的文章
【虚拟机】虚拟化架构与系统部署(Windows系统安装)
查看>>
字节跳动安卓开发实习生面试分享
查看>>
好书分享之——《能力陷进》
查看>>
阅读笔记《c++ primer》
查看>>
阅读笔记《C++标准程序库》
查看>>
基于mirror driver的windows屏幕录像
查看>>
matlab练习程序(PSNR)
查看>>
MFC 改变控件大小和位置
查看>>
MFC实现不规则形状窗口
查看>>
python 解压pkl文件
查看>>
win764位+NVIDIA Quadro 600+VS2010+anaconda+cuda5.5.20 成功配置使用GPU
查看>>
卷积神经网路---第一小例子:解压gz,显示图片
查看>>
python-显示图片 缩放图片 保存图片
查看>>
卷积神经网络中的部分问题
查看>>
DirectX 配置 vs2013 Win10 64bit
查看>>
MFC总结(19) --- CStrig转换成十六进制数
查看>>
win7安装VMwareworkstation+Ubuntu12.04
查看>>
nv12——resize
查看>>
Ubuntu看编译器配置 make menuconfig
查看>>
linux微妙和秒定时器
查看>>