日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源代码分析技巧之——打印调用逻辑 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

開源代碼分析技巧之——打印調(diào)用邏輯

?

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

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

??????(2)相關(guān)的幫助文檔有限,很難短時(shí)間內(nèi)理清頭緒

????? (3)有了代碼在手,但代碼之間的調(diào)用相當(dāng)復(fù)雜,一層一層追蹤總是理不清調(diào)用邏輯順序。

?

??????? 1、從SAMBA源碼說起

?

????????筆者在研究kerberos認(rèn)證時(shí),需要開源的samba軟件。如下是samba的官網(wǎng):http://www.samba.org/

???????

?

???????Samba最新版本為4.1.10,統(tǒng)計(jì)得出其中.c.cpp的文件有近4000個(gè),累計(jì)代碼近百萬(wàn)行。所以對(duì)其的全面分析有一定難度。當(dāng)然,我們可以根據(jù)所需,縮小范圍,從指定所需的指令對(duì)應(yīng)的代碼追溯代碼調(diào)用邏輯。

?

?????? 2、給源碼插入“調(diào)用邏輯線索”代碼

?

?????? 即便如此,有時(shí)還是想直觀看下某個(gè)模塊的調(diào)用順序,能不能直觀的打印出來?而如何打印調(diào)用邏輯呢?如果每個(gè)函數(shù)的頭部都加上:文件名、函數(shù)名、行號(hào)的打印語(yǔ)句,這樣不就解決了我們的問題了吧。

?????? 而編譯器里內(nèi)置了宏,如下幾個(gè)編譯器內(nèi)置的宏定義,這些宏定義不僅可以幫助我們完成跨平臺(tái)的源碼編寫,靈活使用也可以巧妙地幫我們輸出非常有用的調(diào)試信息。

?????? ANSI C標(biāo)準(zhǔn)中有幾個(gè)標(biāo)準(zhǔn)預(yù)定義宏(也是常用的)

__LINE__:在源代碼中插入當(dāng)前源代碼行號(hào);__FILE__:在源文件中插入當(dāng)前源文件名;__DATE__:在源文件中插入當(dāng)前的編譯日期__TIME__:在源文件中插入當(dāng)前編譯時(shí)間;__STDC__:當(dāng)要求程序嚴(yán)格遵循ANSI C標(biāo)準(zhǔn)時(shí)該標(biāo)識(shí)被賦值為1;__cplusplus__:當(dāng)編寫C++程序時(shí)該標(biāo)識(shí)符被定義;__FUNCTION__:在源文件中插入函數(shù)名。

??????? 編譯器在進(jìn)行源碼編譯的時(shí)候,會(huì)自動(dòng)將這些宏替換為相應(yīng)內(nèi)容。

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

???????于是,問題就有所轉(zhuǎn)嫁:給指定文件夾下的所有.c.cpp文件下的所有函數(shù)的第一行插入“printf(“File: %s, Function: %s, Line: %s.\n”, __FILE__, __FUNCTION__, __LINE__);”標(biāo)記打印語(yǔ)句(以下統(tǒng)稱)。

?

?????? 3思路分析

?

????? 完成任務(wù):給指定文件夾下的所有.c.cpp文件下的所有函數(shù)的首行插入指定代碼。

????? 輸入:包含源碼的文件夾路徑名,如:存儲(chǔ)samba源碼的路徑名——C:\tmp\samba4.0.9

????? 中間處理:遍歷、處理、添加標(biāo)記打印語(yǔ)句。

????? 輸出:無。

???? 任務(wù)分解如下:

????? Step1遍歷指定文件夾及其所有子文件夾,將所有文件路徑存入容器vector_all_dir

????? Step2:遍歷容器vector_all_dir,將后綴為.c.cpp的文件存入容器vector_ctype_dir

????? Step3:遍歷容器vector_ctype_dir的每一個(gè)路徑,打開路徑對(duì)應(yīng)的每個(gè)文件—>讀取文件內(nèi)容存入buffer-->清空原有文件內(nèi)容;

????? Step4讀取buffer的內(nèi)容,循環(huán)遍歷buffer,找到函數(shù)頭開始的標(biāo)記)\n{”,并記錄其對(duì)應(yīng)位置position,在poisition+strlen()\n{)后插入標(biāo)記打印語(yǔ)句。這樣就生成了新的buffer——buffer_after_newadd

????? Step5將新的添加標(biāo)記打印語(yǔ)句的buffer_after_newadd重新寫入源路徑,關(guān)閉文件。

筆者已經(jīng)完畢代碼,在samba4.0.9測(cè)試,能夠?qū)崿F(xiàn)預(yù)想的調(diào)用順序邏輯打印。

?

????? 4尚待改進(jìn)點(diǎn)

?

??? (1)讀取buffer部分是按照字符串處理,并且是廢棄以前的文件,將添加標(biāo)記打印語(yǔ)句的新buffer寫入文件的方法。效率較低,有待改進(jìn)。

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

????? 格式一:

void function( ) {}

???? 格式二:

void function( ){ }

?

??????? 5結(jié)語(yǔ)

?

??????? 權(quán)當(dāng)是分析開源的小技巧吧,確實(shí)對(duì)自己分析開源軟件提供了幫助。后續(xù)有了新的心得,會(huì)持續(xù)分享。

?

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

?

轉(zhuǎn)載于:https://www.cnblogs.com/suncoolcat/p/3367578.html

總結(jié)

以上是生活随笔為你收集整理的开源代码分析技巧之——打印调用逻辑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。