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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 继续从深入分析开源代码说起,当然源码分析没有太多捷径可走。笔者只是探讨下,如何分析会更好些。特通过Samba技术邮件群组,向老外提问“如何更好的分析Samba源码”。

继续从深入分析开源代码说起,当然源码分析没有太多捷径可走。笔者只是探讨下,如何分析会更好些。特通过Samba技术邮件群组,向老外提问“如何更好的分析Samba源码”。


      以下是老外回复的翻译,针对Samba源码说的,但对所有的开源代码的分析原理相通,都可以拿来借鉴、消化吸收。


     一、研究开源代码,老外说


      一些人们用来研究Samba源码的想法:


      1、使用论坛中提及代码浏览技术(我现在使用GNU Global + vim,过去使用OpenGrok,并且将来还会用)来轻松地在代码间跳转,弄清楚“这个函数的功能是什么”以及“谁调用了这个函数”是至关重要的。


      2、以你想要运行的方式“动起来”研究源码。可以使用类似systemtap,ktap和dtrace的工具(我在SambaXP对后者写了一个简报)。更深入的了解哪些文件被打开了,运行时的调用堆栈是什么,怎么样读取/写入文件等等……


      祝你在研究中好运!


    二、解读老外回复关键词


      就邮件中老外的几个关键词解读如下:


      1、gnu global是一个类似cscope的工具,也能提供源文件之间的交叉索引。其独到之处在于,当你生成索引文件以后,再修改整个项目里的一个文件,然后增量索引的过程非常快。


      2、OpenGrok是源代码分析利器,速度比SourceInsight快很多。


      3、SystemTap是监控和跟踪运行中的Linux 内核的操作的动态方法。


      4、ktap是一种新的基于脚本的动态跟踪工具,用于Linux的,它使用一种脚本语言,并允许用户动态跟踪Linux内核。类似SystemTap、Solaris DTrace工具。它不依赖于GCC,不需要编译内核模块为每个脚本,实现了嵌入式系统的跟踪需要。


      5、SambaXP对应http://sambaxp.org/,是Samba用户和开发者的技术会议,用于讨论新的需求、新的特征、获取新的技术更新。


      三、个人见解


      正如老外回复,核心点有二个。


       1、代码分析工具。便于代码之间进行跳转,因为代码是死的,手动的方式去查阅调用逻辑关系费时、费力,效率极其低下。笔者的经验是将其编译为一个大工程,笔者最初用的是SourceInsight,其间发现有些函数的跳转不顺畅。后来将整个工程置于VS2010下,虽庞大,但查询函数调用一层一层还是很有用的。


      笔者发现,开源代码有的时候单独一个函数代码行数多、函数参数巨多。举例来讲,Samba源码中有一个函数有近1000行代码的,有一个函数有近20个参数的。这样的话,就需要我们从纵向、横向两个方向分析源码。横向分析函数调用逻辑,纵向分析参数在函数中如何使用的。其中,纵向分析,可以使用NodePad++,他可以在一个文件检索关键词,并会将检索结果的索引列举在最下方,很直观、很方便。


      2、让代码“动起来”。这点可以通过gdb单步调试跟踪函数调用逻辑,可以打印函数调用堆栈,可以通过strace跟踪文件打开、读写操作。


       笔者补充一点,“日志文件”的分析也是至关重要的。Samba源码一般在/usr/local/samba/etc/smb.conf文件中,可以将loglevel设置为1-10,一般3,5,10的日志级别是常用的,日志级别越高,打印的日志越详细,越便于我们分析源码调用。



附老外回复原文:


Some thoughts for people studying Samba:


1. Use code browsing technology of some form.  (I use GNU Global + vim right now.  I've used OpenGrok in the past, and will again.)  The ability to easily jump around the code, and ask "what does that function do" is critical.  Also to ask "What calls this function."


2. Study the system live, running the way you want.  Use tools like systemtap, ktap, and dtrace (I've written a presentation on the latter, that I gave at SambaXP.) to gain insight into what files are being opened, what is the call stack when it happens?  What about reads/writes?  Etc...


Good luck in your search,



      开源代码博大精深,源码分析的乐趣当然令大家神往。笔者总结列举了几个方法了,你使用了几个呢?


      2013-11-23  am9:51思于家中床前



推荐阅读:


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


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


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


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


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


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


【5】开源代码分析技巧之四——高效Windows源码分析


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


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
5月前
|
存储 数据可视化 API
一篇文章讲明白ffdshow源代码分析
一篇文章讲明白ffdshow源代码分析
55 0
|
6月前
|
前端开发 JavaScript Java
童年回忆——捕鱼达人(内含源码inscode一键运行)
童年回忆——捕鱼达人(内含源码inscode一键运行)
|
JSON 小程序 JavaScript
微信小程序学习第一周的第一篇博客(知识点:了解什么是小程序、各文件的作用和小程序的宿主环境)
微信小程序学习第一周的第一篇博客(知识点:了解什么是小程序、各文件的作用和小程序的宿主环境)
|
前端开发 Linux 定位技术
嵌入式Linux系列第21篇:应用程序之开篇闲聊
嵌入式Linux系列第21篇:应用程序之开篇闲聊
|
缓存 Java 数据库连接
Myabtis源码如何阅读,教你一招!!!
Myabtis源码如何阅读,教你一招!!!
|
安全 Android开发
21天打卡Andoid学到的一些小知识-第十九二十二十一天
今天我们学习打卡的内容是:android 10.0 去掉未知来源弹窗 默认授予安装未知来源权限
89 0
|
安全 NoSQL 程序员
开源代码分析技巧之四——国外技术社区提问
在分析源码的时候,我们或多或少都会遇到过技术瓶颈。如果不突破这个瓶颈,接下来的研究就无法继续进行。并且不止对自己是瓶颈、对团队人员、技术顾问、资深人士都没有很好的解决办法。这时候,不妨试一下给源代码作者团队邮件提问。
131 0
|
Linux 索引
开源代码分析技巧之三——老外如是说
继续从深入分析开源代码说起,当然源码分析没有太多捷径可走。笔者只是探讨下,如何分析会更好些。特通过Samba技术邮件群组,向老外提问“如何更好的分析Samba源码”。
826 0
|
C# 数据库 Windows
艾伟:基于.NET平台的Windows编程实战(一)——前言
本系列文章导航 基于.NET平台的Windows编程实战(一)——前言 基于.NET平台的Windows编程实战(二)—— 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)—— 数据库操作类的编写 基于.NET平台的Windows编程实战(五)—— 问卷管理功能的实现 基于.NET平台的Windows编程实战(六)—— 题目管理功能的实现   前言:本系列文章是一个关于.NET Windows编程的入门实战教程。
805 0
|
C# 数据库 Windows
艾伟_转载:基于.NET平台的Windows编程实战(一)——前言
本系列文章导航 基于.NET平台的Windows编程实战(一)——前言 基于.NET平台的Windows编程实战(二)—— 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)—— 数据库操作类的编写 基于.NET平台的Windows编程实战(五)—— 问卷管理功能的实现 基于.NET平台的Windows编程实战(六)—— 题目管理功能的实现   前言:本系列文章是一个关于.NET Windows编程的入门实战教程。
1030 0