天天看點

開源代碼分析技巧之三——老外如是說前言

前言

繼續從深入分析開源代碼說起,當然源碼分析沒有太多捷徑可走。筆者隻是探讨下,如何分析會更好些。特通過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,

開源代碼博大精深,源碼分析的樂趣當然令大家神往。筆者總結列舉了幾個方法了,你使用了幾個呢?

推薦閱讀:

【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

作者:銘毅天下

轉載請标明出處,原文位址:

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

繼續閱讀