天天看點

開源代碼分析技巧之一——列印調用邏輯

開源代碼分析技巧之一——列印調用邏輯

       在研究開源代碼時,大家或許都有這樣的感慨:

     (1)代碼太龐大,少則幾萬行代碼,多則幾百萬行代碼,不知道如何入手;

     (2)相關的幫助文檔有限,很難短時間内理清頭緒;

     (3)有了代碼在手,但代碼之間的調用相當複雜,一層一層追蹤總是理不清調用邏輯順序。

       1、從SAMBA源碼說起

       筆者在研究kerberos認證時,需要開源的samba軟體。如下是samba的官網:

http://www.samba.org/

開源代碼分析技巧之一——列印調用邏輯

   Samba最新版本為4.1.10,統計得出其中.c及.cpp的檔案有近4000個,累計代碼近百萬行。是以對其的全面分析有一定難度。當然,我們可以根據所需,縮小範圍,從指定所需的指令對應的代碼追溯代碼調用邏輯。

      2、給源碼插入“調用邏輯線索”代碼

      即便如此,有時還是想直覺看下某個子產品的調用順序,能不能直覺的列印出來?而如何列印調用邏輯呢?如果每個函數的頭部都加上:檔案名、函數名、行号的列印語句,這樣不就解決了我們的問題了吧。

      而編譯器裡内置了宏,如下幾個編譯器内置的宏定義,這些宏定義不僅可以幫助我們完成跨平台的源碼編寫,靈活使用也可以巧妙地幫我們輸出非常有用的調試資訊。

      ANSI C标準中有幾個标準預定義宏(也是常用的):

    __LINE__:在源代碼中插入目前源代碼行号;

    __FILE__:在源檔案中插入目前源檔案名;

    __DATE__:在源檔案中插入目前的編譯日期

    __TIME__:在源檔案中插入目前編譯時間;

    __STDC__:當要求程式嚴格遵循ANSI C标準時該辨別被指派為1;

    __cplusplus__:當編寫C++程式時該辨別符被定義;

    __FUNCTION__:在源檔案中插入函數名。

       編譯器在進行源碼編譯的時候,會自動将這些宏替換為相應内容。

      于是,printf(“File: %s, Function: %s, Line: %s.\n”, __FILE__, __FUNCTION__, __LINE__);這個C的語句就是我們所需的。

      于是,問題就有所轉嫁:給指定檔案夾下的所有.c及.cpp檔案下的所有函數的第一行插入“printf(“File: %s, Function: %s, Line: %s.\n”, __FILE__, __FUNCTION__, __LINE__);”标記列印語句(以下統稱)。

      3、思路分析

     完成任務:給指定檔案夾下的所有.c及.cpp檔案下的所有函數的首行插入指定代碼。

     輸入:包含源碼的檔案夾路徑名,如:存儲samba源碼的路徑名——C:\tmp\samba4.0.9。

     中間處理:周遊、處理、添加标記列印語句。

     輸出:無。

    任務分解如下:

     Step1:周遊指定檔案夾及其所有子檔案夾,将所有檔案路徑存入容器vector_all_dir;

     Step2:周遊容器vector_all_dir,将字尾為.c及.cpp的檔案存入容器vector_ctype_dir;

     Step3:周遊容器vector_ctype_dir的每一個路徑,打開路徑對應的每個檔案—>讀取檔案内容存入buffer-->清空原有檔案内容;

     Step4:讀取buffer的内容,循環周遊buffer,找到函數頭開始的标記“)\n{”,并記錄其對應位置position,在poisition+strlen(“)\n{”)後插入标記列印語句。這樣就生成了新的buffer——buffer_after_newadd;

     Step5:将新的添加标記列印語句的buffer_after_newadd重新寫入源路徑,關閉檔案。

筆者已經完畢代碼,在samba4.0.9測試,能夠實作預想的調用順序邏輯列印。

     4、尚待改進點

   (1)讀取buffer部分是按照字元串處理,并且是廢棄以前的檔案,将添加标記列印語句的新buffer寫入檔案的方法。效率較低,有待改進。

   (2)以“)\n{”判定函數不具有一般性。第一,Windows下的換行符為\r\n,而Linux下的換行符為\n;第二,函數的書寫不同比如如下的格式:格式一、格式二都很常用,都應該考慮。

     格式一:

void function( )

{

}

    格式二:

void function( ){

       5、結語

       權當是分析開源的小技巧吧,确實對自己分析開源軟體提供了幫助。後續有了新的心得,會持續分享。

        2013/10/13 am9:55思于家中床前

推薦閱讀:

【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

【5】開源代碼分析技巧之四——高效Windows源碼分析

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