开源代码分析技巧之——打印调用逻辑
?
開源代碼分析技巧之——打印調用邏輯
?
??????? 在研究開源代碼時,大家或許都有這樣的感慨:
????? (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思于家中床前
?
轉載于:https://www.cnblogs.com/suncoolcat/p/3367578.html
總結
以上是生活随笔為你收集整理的开源代码分析技巧之——打印调用逻辑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 易 捷文件共享Web服务器破解,局域网临
- 下一篇: Android 超级工具类