本文是Leedd针对中标普华LINUX的磁盘管理器所提交得BUG进行分析整理出一般得debug的思路和方法,里面含有grep、gdb 、diff、mock等工具的常用命令,二进制包的编译安装,yum、rpm及rpmbuild的应用等,供大家学习参考。
一、复现BUG:
首先接到这个bug的时候,按照bug描述可以复现,
点击:…… (按测试人员提交BUG所进行的操作说明,或自己发现bug时候所进行的操作)
二、分析BUG及明确解决思路:
该bug为磁盘管理器无法对根目录进行操作,
首先确定是不是程序逻辑问题。一般来说对磁盘等系统文件的操作只能是超级用户来进行操作,普通用户不能对根目录或是OS程序所在的宿主目录进行操作。(一般程序无特别大的逻辑问题)
基于该分析由以下几个解决思路,
-
当普通用户勾选对根目录进行操作的时候,弹出对话框提示用户无法对根目录进行操作,然后系统后台对该操作不做处理,同时前台界面无变化。(对用户的实际操作无意义及改变,影响用户体验。)
-
把该操作复选框打灰,直接不允许用户进行任何操作。(比较可取)
-
直接在前台界面中不显示硬盘根目录的相关信息。(用户无法知道所有磁盘的信息,排除)
-
看程序本身是否能对根文件系统进行操作,假如可以操作,但是因为操作函数出错带来的问题,则完善之。(待研究)
- 如何寻找BUG所在软件包:
桌面有软件的快速启动方式。右键点击属性,在基本信息一栏可以看到“命令:baobab” 即为该软件的快速启动命令
思考:如果没有快捷方式或是不借助于快捷方式能否定位软件得启动命令,有没有通用的一般方法?(maybe:查看当前系统的所有进程,启动该bug所在程序,然后再查看当前系统所有进程,对比前后进程,定位该程序所对应的进程及快捷操作名称)
根据快速启动命令: baobab
用 rpm –qf /usr/bin/baobab
# rpm -qf /usr/bin/baobab
gnome-utils-2.24.1-1_nd5_1.i686
来确定该BUG与gnome-utils-2.24.1-1_nd5_1.i686相关。
三、下载源代码:
用yumdownloader –source gnome-utils
安装.src.rpm软件包
1. #rpm -i your-package.src.rpm
2. #cd /home/Lee/rpmbuild/SPECS
3. #rpmbuild –bp your-package.specs /* 一个和你的软件包同名的specs文件,如果rpmbuild时候缺失依赖文件,yum或网络搜索安装即可 *
4. #cd /home/Lee/rpmbuild/BUILD/your-package/ 一个和你的软件包同名的目录
5. #./configure
6. #make
7. #make install
找到源代码目录 :
#cd /home/lee/rpmbuild/BUILD/gnome-utils-2.24.1/baobab/src
四、查找引起bug的代码并修改(重点)
1.查找方法一:用gdb调式程序:
#gdb baobab
(gdb)run
运行“ ——-”复现bug操作
(gdb) where
根据where提示定位到文件的某一行数,然后查找该行函数或变量对应的全局关系
如果where提示中有错误的函数或变量名称,则全局定位该函数或是变量所在文件:
#grep NAME *.c
根据查找到的位置来研读代码。
2.方法二,如果含有gnome界面
#LANG=’en’ baobab
运行到该bug所在得界面,根据图形界面的标题文字或是框架内固定内容定位到程序所在的位置。
#grep NAME *.c
五、制作补丁文件并打包
在改好bug并经过简单的测试确定无其他因为本代码改动所带来得错误后,可以制作补丁文件并为打包,(why 补丁文件 1.标注改动位置,尊重原作者的成果,明确自己所做变动及工作。2便于后期维护 3.避免其他错误或软件升级带来得麻烦)具体步骤如下:
备份rpmbuild内的原来得程序文件所在文件夹为 Name_back 修改后的文件夹为NAME,
用diff对比制作patch文件,
格式:diff 原文件 修改后文件 >> patch
[Lee@localhost BUILD]$ diff -Nur gnome-utils-2.24.1-backup gnome-utils-2.24.1 >> gnome-utils-2.24.1-neoshine-unable-root-dir.patch
制作好补丁文件后,在SPECS目录中的spec文件中需要修改以下几处:
Release:+1 /*版本号码+1*/
Patch0: gnome-utils-%{version}-neoshine-unable-root-dir.patch /*声明补丁包*/
%prep
%setup -q
%patch0 -p1 -b .unable-root-dir /*安装补丁包*/
%changelog /*注明changelog*/
* Wed Sep 30 2009 Leedd -2.24.1-1_nd5_2
– Resolve the scan root bug (Bug 1096s7 with cs2c ND5 )
然后打包修改后的rpm包:
rpmbuild -ba gnome-utils.spec
六、检验修改后的包
mock的应用
1
usermod -a -G mock myusername
mock 运行是用自己的用户 最好不要用root
2
mock -r <config-name> init
eg:
mock -r neoshine-5-i686 init
会构建一个干净的chroot 环境大约不到400M
/var/lib/mock/neoshine-5-i686/root
3
mock -r <configfile> rebuild package-1.2-3.src.rpm
eg:
[Lee@localhost SRPMS]mock -r neoshine-5-i686 –rebuild gnome-utils-2.24.1-1_nd5_2.src.rpm
INFO: Results and/or logs in: /var/lib/mock/neoshine-5-i686/result
/* New package you will also find in the dir */