kernel中在mm目录和drivers/char/drm目录下都定义了 alloc_pages函数,那么可以以下列方式调用genfull:
genfull -s "mm include/linux drivers/block arch/i386"
实际的使用中,-s非常方便,请大家记住这个选项。
当full.graph很大时,大量的时间花费到读取输入文件上了,例如kernel的full.graph是很大的,前面生成的大约有15M,这还不是全部内核的函数调用分析信息。为了节省时间,可以讲gengraph以daemon方式运行,这药使用-p选项:
gengraph -p -g linux-2.6.25/full.graph
该命令返回时gengraph以daemon方式运行,同时在/tmp目录下生成了codeviz.pipe文件。要生成函数调用图,可以使用-q选项:
gengraph -q -t -d 2 -f alloc_pages
要终止gengraph的运行,使用如下命令:
echo QUIT > /tmpcodeviz.pipe
以分析《嵌入式实时操作系统 uC/OS-II (第二版)》中的第一个范例程序为例,是什么程序不要紧,这里主要看的是如何使用及使用后的效果。
首先分析main():
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):
?

?
1. 在运行./install_gcc-4.6.2.sh时出现下面错误:
gcc configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+
从错误中可以看出:GCC编译需要GMP, MPFR, MPC这三个库(有的系统已经安装了就没有这个提示,我的没有安装),有两种安装方法(建议第二种):
(1)二进制源码安装(强烈不推荐)
我使用的版本为gmp-4.3.2,mpfr-2.4.2和mpc-0.8.1,在“ftp://gcc.gnu.org/pub/gcc/infrastructure/" 下载,根据提示的顺序分别安装GMP,MPFR和MPC(mpfr依赖gmp,mpc依赖gmp和mpfr),这里全部自己指定了安装目录,如果没有指定 则默认分装在在/usr/include、/usr/lib和/usr/share,管理起来不方便,比如想卸载的时候还得一个个去找:
安装gmp: ./configure --prefix=/usr/local/gmp-4.3.2; make install
安装mpfr: ./configure --prefix=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2/; make install
安装mpc: ./configure --prefix=/usr/local/mpc-0.8.1 --with-gmp=/usr/local/gmp-4.3.2/ --with-mpfr=/usr/local/mpfr-2.4.2/; make install
PS:安装过程中可能又出现新的错误提示,请看2、3、4条。
配置环境变量:我这里指定了安装位置,如果没有指定则 这几个库的默认位置是/usr/local/include和/usr/local/lib,不管有没有指定GCC编译时都可能会找不到这三个库,需要确 认库位置是否在环境变量LD_LIBRARY_PATH中,查看环境变量内容可以用命令
echo? LD_LIBRARY_PATH
设置该环境变量命令如下:
指定安装:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/gmp-4.3.2/lib:/usr/local/mpfr-2.4.2/lib:/usr/local/mpc-0.8.1/lib
默认安装:exportLD?L?IBRARY?P?ATH="? LD_LIBRARY_PATH:/usr/local/lib
PS:十分不推荐这种安装方法,一般来说这样的确可以成功安装,但是也不排除安装过程中又出现新的问题,具体看问题5。
?
(2)gcc自带脚本安装(强烈推荐)
方法(1)的安装方法十分繁琐,安装过程中可能出现各种预料不到的新错误,因此gcc 源码包中自带了一个gcc依赖库安装脚本download_prerequisites,位置在gcc源码目录中的 contrib/download_prerequisites,因此只需要进入该目录,直接运行脚本安装即可:. /download_prerequisites
PS:该脚本内容如下:
?
可见是通过wget的方式下载安装,因此如果没有安装wget则需要先安装下。
大家仔细看下这个脚本,发现非常简单,就是从网上自动下载三个依赖库并解压,然后建立三个改名后的软链接分别指向这三个库,这里建立软链接过程中也可能出错,具体看问题6,大家也可以自己修改脚本,改成直接修改名称然后移到gcc目录下。
技巧:从这里也可以看出,gcc所依赖的库其实只要解压了放在gcc当前目录下就行了,方法(1)的那么多步骤其实都可以省掉,直接将下载的三个压缩包解压后改名移到gcc下面即可,也不用设置环境变量了。
?
2. 编译gmp时出现错误:
No usable m4 in $PATH or /usr/5bin (see config.log for reasons).
由此可以看出是缺少M4文件。可以去这里下载:http://ftp.gnu.org/gnu/m4/然后编译安装,我由于是Ubuntu系统,就直接
sudo apt-get install m4安装了。
?
3. 安装mpfr时出现错误:
configure: error: gmp.h can't be found, or is unusable.
这是因为在安装mpfr时未先安装gmp导致的,mpfr依赖于gmp。
?
4. 安装mpc时出现错误:
configure: error: libgmp not found or uses a different ABI.和configure: error: libmpfr not found or uses a different ABI.“。
同样是因为未安装mpc依赖的库gmp和mpfr。
?
5. 在运行./install_gcc-4.6.2.sh过程中出现错误,即按照gcc过程中出现的问题:
(1)libmpfr.so.1: cannot open shared object file: No such file or directory
分析:该脚本就是安装gcc,但是如果你出现了问题1,并且使用方法(1)解决该问题,那么你后期就可能出现这样的问题,当然你运气没那么背的话一般不会出现这样的问题,反正我运行比较背,出现了这样的问题。
解决方法:可以参考这篇文章http://blog.c