淘先锋技术网

首页 1 2 3 4 5 6 7

于渊同学,你真是越来越懒了。。讲到文件系统调试,你都说了这是个效果很high的调试方式,那为什么都不说下怎么使用,甚至连源码里都没有调用的示例,这真是。。。

总之,关于Oranges 9.17节提到的文件系统调试方法,确实是个不错的主意,很直观,也比较方便,虽然在dump内存的时候会有些慢,后期用的也不多,但是不可否认,他在冗长的文件系统一章中,还是起到了不小的作用。

但是书中说明不够详细,造成了我调试的时候遇到不少难题,于是这里整理一下。

首先需要安装2个东西,我用的ubuntu,直接从软件仓库里拖。

sudo apt-get install gthumb
sudo apt-get install graphviz

然后需要增加和修改一些东西。

● fs/disklog.c
● lig/syslog.c
● 增加函数声明
● 增加消息类型DISK_LOG
● Makefile做相应修改

调用方式:在TestA中调用dump_fd_graph(“open a file”);
运行bochs后等待数秒,关闭bochs。然后运行genlog,你就会发送有个窗口弹出来了哦,里面有个PNG的图像哦,打开一看,是清晰明白的文件系统的快照哦。

什么?你说你运行bochs的时候停住了?
好吧,看来你遇到和我一样的问题了。仔细跟踪一下,我发现disklog.c中,disklog函数中定义的静态变量pos似乎没有初始化为0,非常奇怪吧。其实我现在还没有找到原因,但是可以曲线救国,那就是把他定义成个全局变量(当然还是改个名好,不然这种大众脸的名字会迷惑到你的),然后在FS初始化的时候,同时初始化这个pos。另外仔细看下dump_fd_graph函数里也有个静态变量graph_idx,同样处理一下。再次运行bochs,genlog。。。然后就能看到文件系统快照的PNG了。

还有个很奇怪的问题没解决,在disklog函数中,有一句memset(fsbuf, 0×20, chunk*SECTOR_SIZE);初始化的语句,我在后来运行的时候会停在这里,虽然将他注掉不会有什么明显问题。

关于genlog的功能,他会将log从硬盘镜像中提取出来,存成filedesc.dot,然后将filedesc.dot分割成数个文件(取决去程序中调用了几次dump_fd_graph函数),并转换为PNG,最后使用gthumb打开显示png。需要注意的是,不可以在两个进程中同时调用dump_fd_graph函数,原因是pos是全局变量(或者是静态局部变量),他的值可能会因为两个进程同时调用而产生混乱,最后硬盘镜像中的log扇区中内容也会混乱。

参考资料:
[1] 《Orange’s 一个操作系统的实现》,作者于渊,电子工业出版社