在做开发8年后,离开了自己搭建的开发环境,开始了自己分析其他软件的旅程。以前是根据需求来自主的开发软件,从软件初始化到完成整个系统基本都是根据需求,然后设计、开发、测试,很少会涉及分析他人写的程序。一是工作中没有这样的需要,二是很不喜欢分析他人的程序,可能是因为觉得要跟上他人的思维模式很困难。所以也尽量避免去分析别人的程序。
后来去到需要分析MTK、MSTAR、互芯代码的公司,工作离不开分析代码。于是只好慢慢去适应这种变化。现在回头在看,自己以前的害怕有些固步自封。分析他人的代码其实没有那么难。也许有其他朋友也像我以前那样,不太喜欢看其他人的代码,尤其是写的很乱的代码。其实真没有必要害怕,分析代码的工作并没有那么无厘头,是有迹可寻,并能逐步深入的。即使很烂的代码,它也有逻辑,只不过组织得比较粗糙,需要耐心点。
分析代码第一条心得:平常心。往往要你分析的代码是与工作任务有关的,很可能是以前人留下的,或是网上下载的。极有可能是你不熟悉的领域。 在接到这样的任务时候,重要的是有一个平常心对待。心理不要害怕和拒绝。就像完成你熟悉的任务一样。
分析代码第二条心得:从软件初始化开始梳理。不管是系统软件、应用软件还是算法。都会有个初始化过程,这个过程会透露出很多有用信息。例如:需要用到的全局变量、模块和外设等等。还可以整理出软件创作者的编程习惯、命名方法。这些对分析代码都有帮助。
分析代码第三条心得:结合上一条,先分析熟悉的模块。这样做是利用自己熟悉的东西快速建立起对创作者的编程风格的认知。这样才有了继续往下分析的工具。例如:一些工具函数、宏定义和一些关键的结构。
分析代码第四条心得:分析以一个目标为主线进行,切不要一开始就做全面研究。例如:代码是如何开始的;如何结束的;某个功能是什么条件调用的;在哪处理的;最后怎么返回的。一次分析以一个主线开始,得到结果后再开始下一个。然后把相关主线串起来,就形成了对代码的初步认识。如此循环往复,最后就理解了代码。
分析代码第五条心得:先了解代码的背景需求和知识,在开始分析。有些代码你可能从来没有接触过相关的知识,这个时候贸然分析收效是很有限。往往卡在为什么要这样操作或者这样操作有什么意义的问题上。这就需要你了解编写这段代码的背景知识。例如:硬件的datasheet、原理图、协议等等。这时候就需要静下心来将这些知识了解一下,不用太深入,有人问人,无人百度或谷歌。这也是分析代码对个人最大的提高所在,千万不要错过哟。
分析代码第六条心得:有能力尽量搭建可测试环境。这个不是每次都能办到的,但是如果时间允许你可以构建一个可以让代码跑起来的环境后进行分析。这样的好处不言自明。重要的在于让你思考了如何运行起软件,从外部来理解你要分析的软件。也许你暂时没有这个能力,但多从这方面想想会让你积累更深厚功底。
分析代码第七条心得:根据自己的经验大胆猜测。有时候你会遇到只有库没有源码的情况。这时候你就必需凭经验来猜测库中函数的处理逻辑。如果你能反汇编代码,粗略读一下汇编代码,可以大致验证一下你的猜想。如果能运行代码就可以断点调试,更改调用环境测试。
分析代码第八条心得:有map文件要好好利用。有些代码编译后会生成map文件,里面记录了编译生成的信息。尤其在嵌入式程序中。好好利用map文件辅助分析,会很有帮助。嵌入式代码,可以从map中看到程序和数据的空间分配状况,帮助分析代码初始化过程。pc模块、算法代码,可以从map或者类似map功能的文件中,找到全局变量或者函数入口地址,帮助分析进行反汇编后的代码。
后来去到需要分析MTK、MSTAR、互芯代码的公司,工作离不开分析代码。于是只好慢慢去适应这种变化。现在回头在看,自己以前的害怕有些固步自封。分析他人的代码其实没有那么难。也许有其他朋友也像我以前那样,不太喜欢看其他人的代码,尤其是写的很乱的代码。其实真没有必要害怕,分析代码的工作并没有那么无厘头,是有迹可寻,并能逐步深入的。即使很烂的代码,它也有逻辑,只不过组织得比较粗糙,需要耐心点。
分析代码第一条心得:平常心。往往要你分析的代码是与工作任务有关的,很可能是以前人留下的,或是网上下载的。极有可能是你不熟悉的领域。 在接到这样的任务时候,重要的是有一个平常心对待。心理不要害怕和拒绝。就像完成你熟悉的任务一样。
分析代码第二条心得:从软件初始化开始梳理。不管是系统软件、应用软件还是算法。都会有个初始化过程,这个过程会透露出很多有用信息。例如:需要用到的全局变量、模块和外设等等。还可以整理出软件创作者的编程习惯、命名方法。这些对分析代码都有帮助。
分析代码第三条心得:结合上一条,先分析熟悉的模块。这样做是利用自己熟悉的东西快速建立起对创作者的编程风格的认知。这样才有了继续往下分析的工具。例如:一些工具函数、宏定义和一些关键的结构。
分析代码第四条心得:分析以一个目标为主线进行,切不要一开始就做全面研究。例如:代码是如何开始的;如何结束的;某个功能是什么条件调用的;在哪处理的;最后怎么返回的。一次分析以一个主线开始,得到结果后再开始下一个。然后把相关主线串起来,就形成了对代码的初步认识。如此循环往复,最后就理解了代码。
分析代码第五条心得:先了解代码的背景需求和知识,在开始分析。有些代码你可能从来没有接触过相关的知识,这个时候贸然分析收效是很有限。往往卡在为什么要这样操作或者这样操作有什么意义的问题上。这就需要你了解编写这段代码的背景知识。例如:硬件的datasheet、原理图、协议等等。这时候就需要静下心来将这些知识了解一下,不用太深入,有人问人,无人百度或谷歌。这也是分析代码对个人最大的提高所在,千万不要错过哟。
分析代码第六条心得:有能力尽量搭建可测试环境。这个不是每次都能办到的,但是如果时间允许你可以构建一个可以让代码跑起来的环境后进行分析。这样的好处不言自明。重要的在于让你思考了如何运行起软件,从外部来理解你要分析的软件。也许你暂时没有这个能力,但多从这方面想想会让你积累更深厚功底。
分析代码第七条心得:根据自己的经验大胆猜测。有时候你会遇到只有库没有源码的情况。这时候你就必需凭经验来猜测库中函数的处理逻辑。如果你能反汇编代码,粗略读一下汇编代码,可以大致验证一下你的猜想。如果能运行代码就可以断点调试,更改调用环境测试。
分析代码第八条心得:有map文件要好好利用。有些代码编译后会生成map文件,里面记录了编译生成的信息。尤其在嵌入式程序中。好好利用map文件辅助分析,会很有帮助。嵌入式代码,可以从map中看到程序和数据的空间分配状况,帮助分析代码初始化过程。pc模块、算法代码,可以从map或者类似map功能的文件中,找到全局变量或者函数入口地址,帮助分析进行反汇编后的代码。