如何快速的定位程序中某个功能对应的代码?
我们经常会接手别人开发完的一些代码,而且通常有这样一些任务要做:
1.解决某个模块的指定bug。
2.增加或者修改某个模块的feature。
3.添加新的功能模块。
因此我们经常需要找到一个功能模块的相应源文件,甚至一个源文件的某个函数,更甚至于函数中的某一行,某个变量,某个参数。针对有界面的情况,还需要考虑gui配置的xml文件,还有全局的配置文件。等等。。。。
在没有文档和其他熟悉这个程序的人指导的情况下,如何快速的定位呢?当然前提是,对于至少有点经验的程序员来讲。
比如,在修改某个界面的情况下,我需要修改一个文本的字体和大小,
那么快速的方法是:
1.找到字符串所在的文件,grep -anr 'stringtoFind' *
2.通过上一步获取的字符串引用名称再去查找哪些控件引用了这个字符串, grep -anr ' #stringname #' *
3.找到控件所在地,然后修改控件属性。
再比如,如果涉及到源码的情况:
1.通过源文件的名字猜测,得到大致的定位
2.分析大致函数调用关系
3.通过排除法,比如,注释某个函数代码
实际项目中,大家都用什么方式来快速定位,能分享下经验吗??只以靠静态分析代码,我觉得可能是效率比较低的方法,因此有更高效的方法吗??
-
涉及到控件资源等截面相关的可能麻烦点,调用关系,功能逻辑分析可以试试Understand和SourceInsight之类的工具。 – 王辉 2012-03-07
-
没接触过你说的grep -anr '#stringname#' *,你说这个可以查找哪些控件引用了这个字符串,能详细解释下你说的控件是什么意思吗? – 麦田 2012-08-22
-
用Editplus自带的‘多文件查找’功能可以很快找到你要的对应内容。 – 彬临天下 2013-01-11
-
@彬临天下 我以前老这么干 – snowjake 2013-01-16
这个确实有点棘手,当接手别人的项目时维护起来真得是不容易,特别是出现了错误定位Bug更是头疼,说说我自己平常是怎么做的吧。首先就像@billmao说的一样,一定要让程序先运行起来,然后先根据程序运行的模块,先慢慢摸清程序各业务模块对应的代码模块。这样分开以后就会对整个程序架构有所了解,哪些是业务模块,哪些是程序核心类库及各类库的所对应的功能。经过对业务逻辑和程序逻辑的了解,这样当程序出现Bug的时候至少能大致定位到出错的地方,缩小了范围,接下来可以借助开发软件对代码进行跟踪,断点。最后确定Bug所在。
针对带界面的模块:
1.基于字符串或图片的工具查找定位法:
在界面上面无非就是字符串和图片,在待查模块的界面锚定一个字符串比如"music list",这个字符串必然被待查模块引用,于是查找所有引用的地方,方法
a.如果是ide开发环境,里面直接查找字符串"music list"。
b.linux命令行,在项目目录下grep -anr 'music list' *
使用这种方法之后,将待选范围可以缩到非常小了。几乎是函数级别了。
图片的查找更方便,人眼比较就能找到对应图片,取出图片名继续上面的a,b操作。
2.有些特定的功能需要运行才能获取精确定位,使用注释法。通过注释某个函数,或者某几句可选代码。可以很快查处对应功能所在。
总结:静态分析可以从整体上把握一个程序代码,可能是必要的,但是实际项目的工作复杂性太大了,不确定性更多,你接手的代码不太可能会像经典开源项目那样善心悦目,很多时候是充斥了大量的错误和冗余的代码,极端的时候你可能看了半天代码,实际一调试发现,之前认为完成某个功能的那段代码根本没有被调用,浪费时间啊!!!杯具!!因此,快速查找法和注释法能帮你事半功倍。
提供一种针对mvc架构的php网站的查找思路:
如果是维护一套代码,最好事先抽时间看一看它的逻辑架构。
有两个地方最好事先搞清楚:
1.代码的消息分发系统。
2.代码的数据库接口、vendors、与外界通信的第三方接口。
一般功能模块就是实现从1到2的过程,介于这两者之间,
从浏览器(也就是你说的界面)上找到要向消息分发器传入的参数,最笨的方法就是从消息分发器走起,一步步往下查。但是这么正规的走往往无疾而终,即使成功也花很多时间。
所以奇正相生很必要,一般代码里的函数处理是非常蛋疼的几层十几层的层层递进,但是处理某个功能的上下层函数词缀是有相似的(起个名字,叫特征词缀),直接搜索特征词缀就可以了。
有注释直接搜索注释。