开源代码分析技巧之——高效Windows源码分析

开源代码分析技巧之——高效Windows源码分析

       引言:项目开发中,我们免不了在已有代码或版本的基础上新增代码。这个时候,如何高效的读懂别人代码逻辑,如何从几十万乃至上百万行代码中找到自己需要的逻辑显得尤为重要。

       以下笔者结合自己的近来的经验就Windows源码分析做下解读。

一、了解Windows的代码特点

       相比于Linux源码,封装的特性在Windows下体现的尤为突出。尤其MFC下的程序开发,我们需要常备MSDN,了解函数接口的定义、返回值、参数(in或out)的含义。

       熟悉MFC的消息映射和传递机制。对于现成的实现,我们可参考使用不同的API,不必要重复造轮子。

二、通过文档了解代码实现

       项目中一般团队开发,对于已有的实现会有前期的需求分析文档、总体设计文档、详细或微型设计文档。对一个新人来讲,通过文档了解版本中已经实现的功能、采用的技术、实现的流程图等是很高效的方法。

       衡量你对实现功能了解的标准就是:你能给一个对该领域陌生的人讲解明白大致实现的原理。

三、自顶向下,分解开来

       虽然已有的代码量非常庞大,但对个人而言不可能面面俱到,我们往往是根据项目组的安排维护其中的一个或大或小的模块的代码量,在其中修改已有代码逻辑或新增新的功能。有了文档的大局观还需要自顶向下,将代码分解开来,直到细化到你所维护的代码的每一行。

       Windows下的自顶向下无非是:工程—>模块-->-->函数-->代码行

四、分析源码逻辑

        对于自己负责模块的功能实现,我们要了解新增功能的代码的添加位置?代码的前后逻辑及执行流程是怎么样的?新加后会不会对已有代码逻辑构成影响

        笔者案例:在代码中新增序列号未开启的功能,用于实现当客户购买设备当尚未购买该新增功能的序列号时是没有权限执行后续的操作的。这个时候就需要我负责的客户端的模块接收设备端的模块的反馈消息,并以弹窗的形式醒目的提示给客户。上面提到的添加位置、流程、构成影响三个问题便都出现。我的实现如下:

       第一步:充分跟读已有的代码逻辑,知道原有代码对初始登录出现错误(如网络异常)是如何提示用户的,大致确定添加的位置;

       第二步:考虑如何从对端(设备端)获取提示信息;

       第三步:在第一步的位置新增第二步获取的代码,并做不同场景下的测试,确保第一步位置的正确性以及新增代码逻辑不会对已有代码构成影响。

五、改动源码的前提是已经对已有逻辑了然如胸

       区别于以前自己写的小程序,代码逻辑简单、不与其他代码或逻辑关联,很容易定位出错原因。实际项目开发中大家团队作战、各司其职。修改一处的代码有可能“牵一发而动全身”。并且代码bug出现有的是必现的,有的和环境、场景有关为非必现的。非必现bug很难排查。

       笔者案例:在开发中笔者需要动态加载DLL,以调用其中提供的函数接口。笔者想当然以为,动态加载只要加上DLL的路径就没有问题。当时本机调试也没有问题,但经理说要在虚拟机看下执行效果时,将Release版本可执行程序拷贝过去至虚拟机后,发现根本不能执行。即:在本机执行没有任何bug,为什么换台机器后就不能执行了呢?这种问题是如何出现的以及如何调试解决的呢?(该问题正是一年前360面试官问过我的题目)。笔者排查如下:

       第一步:通读新增代码,看有没有逻辑bug。如果有修改之再测试;如果没有,则思考至第二步。

       第二步:为什么会换台机器就运行不了了?猜测多半和场景有关,基本联想到新增的动态链接库,在两台机器的安装路径不一致。

       第三步:基本确立DLL加载的问题,思考如何避免。查看原有代码逻辑对DLL进一步封装为COM接口,加载COM接口不需要路径,仅一个ID值就能识别,换成COM方式加载后就避免了上述问题。

       足现对已有代码熟悉的重要性。

六、多调试而不是去猜bug原因会事半功倍

        如下调试要常备:GetLastError之ErrorCode、单步Debug调试、asm –int 3调试(内联宏汇编,int表示触发软中断,3是中断号,这个依赖于具体的操作系统。解决常规断点调试解决不了的问题,如对EXE、DLL调试,如1000次循环在999次挂掉的调试)。

        笔者曾遇到Http访问能正确获取页面信息,但是换成Https页面就不可以的bug。访问Https获取页面内容bug的解决就是通过GetLastError的错误码,得知需要绕过SSL认证获取页面信息,并进一步添加Flag标记变量将SSL认证回避掉。

        以VC6.0为例,是可以通过View-->Debug Windows --> Call Stacks 查看调用堆栈的。如下图所示:

        对于复杂的功能实现,有了函数调用堆栈会加快我们的分析。

七、仅在必要的时候和原作者联系

       即便一个项目组中,因为工作了大家都比较忙,各自手里都有任务量,尽量自己去解决。即便非得去向原作者咨询问题,也要事先将待问问题的思路、自己的想法在本上都记录好,确保高效。

       个人体会:工作了,非在学校,大家的时间都特别宝贵,如果你耽误了别人的时间很可能导致别人进度的延误。而在学校,笔者曾经帮别人用6个小时多的时间解决word2010,2007,2003卸载不干净的问题。工作后会发现6个小时,是工作一天的3/4的时间,忒宝贵了

        2014-1-12 pm17:40思于家中床前


推荐阅读:

【1】开源代码分析技巧之一——打印调用逻辑

http://blog.csdn.net/laoyang360/article/details/12676131

【2】开源代码分析技巧之二——gdb单步调试

http://blog.csdn.net/laoyang360/article/details/14102181

【3】开源代码分析技巧之三——老外如是说

http://blog.csdn.net/laoyang360/article/details/16897117

【4】开源代码分析技巧之四——国外技术社区提问

http://blog.csdn.net/laoyang360/article/details/16897827

 

作者:铭毅天下

转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/18186529

如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

Windows 2000,原名Windows NT 5.0。它结合了Windows 98和Windows NT 4.0的很多优良的功能/性能与一身,超越了Windows NT的原来含义。   Windows 2000系列分成四个产品:Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server, Windows 2000 Datacenter Server。 Windows 2000 Professional 是一个商业用户的桌面操作系统,也适合移动用户,是Windows NT Workstation 4.0的升级。Windows 2000 Server和Advanced Server分别是Windows NT Server 4.0及其企业版的升级产品。Windows 2000 Datacenter Server是一个新的品种,主要通过OEM的方式销售,是,支持32个以上的CPU和64GB的内存,以及4个节点的集群服务。 Windows 2000平台包括了Windows 2000 Professional 和Windows 2000 Server前后台的集成,下面仅从五个方面简要地介绍一下它的新特性和新功能。   一、活动目录   Windows 2000 Server在Windows NT Server 4.0的基础上,进一步发展了“活动目录(Active Directory)”。活动目录是从一个数据存储始的。它采用了类似Exchange Server的数据存储,称为:Extensible Storage Service (ESS)。其特点是不需要事先定义数据库的参数,可以做到动态地增长,性能非常优良。这个数据存储之上已建立索引的,可以方便快速地搜索和定位。活动目录的分区是“域(Domain)”,一个域可以存储上百万的对象。域之间还有层次关系,可以建立域树和域森林,无限地扩展。   在数据存储之上,微软建立了一个对象模型,以构成活动目录。这一对象模型对LDAP有纯粹的支持,还可以管理和修改Schema。Schema包括了在活动目录中的计算机、用户和打印机等所有对象的定义,其本身也是活动目录的内容之一,在整个域森林中是唯一的。通过修改Schema的工具,用户或发人员可以自己定义特殊的类和属性,来创建所需要的对象和对象属性。   活动目录包括两个方面:一个目录和与目录相关的服务。目录是存储各种对象的一个物理上的容器;而目录服务是使目录中所有信息和资源发挥作用的服务。活动目录是一个分布式的目录服务。信息可以分散在多台不同的计算机上,保证快速访问和容错;同时不管用户从何处访问或信息处在何处,都对用户提供统一的视图。 活动目录充分体现了微软产品的“ICE”,即集成性(Integration),深入性(Comprehensive),和易用性(Ease of Use)等优点。活动目录是一个完全可扩展,可伸缩的目录服务,既能满足商业ISP的需要,又能满足企业内部网和外联网的需要 最近在网上游荡的时候发现msdos和windows 2000的原代码 ,不敢独享,所以分享给大家
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铭毅天下

和你一起,死磕Elastic!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值