前言
在海量的源碼面前,如何更好的切入到源碼,鎖定我們需要的那一行,有時顯得格外重要。
而通常來講,我們知道源碼包,或多或許我們也同時有一些參考文檔(可能不全),并且知道源碼能提供的一些功能。比如以Samba4.0.0的源碼為例,在samba4.0.0/source4下就有介紹source4新功能說明的幫助文檔;在kerberos相關檔案夾下就有介紹kerberos協定實作相關的文檔;在Samba官網上有其從80-90年代一路走來各個版本的文檔,資訊量非常大,篩選需要花些時間。而對于一些功能的提供,往往是一些提供給我們可用的工具,比如安裝Samba後在/usr/local/samba/bin下有samba-tool、tdbtool、rpcclient等工具。這樣工具的用法,我們可以man一下,不同的參數便一目了然。
順着這個思路,我們就可以加上參數、子參數,運作設定的工具,這時候就有了執行這些程式的程序,可通過ps –aux檢視。有了這些程序,我們就可以展開我們的單步調試了。
1、從SAMBA源碼現身說法
對于比如/usr/local/samba/bin目錄下的檔案,可以通過File檢視檔案屬性,有的是編譯好的二進制可執行檔案,有的則是一些python腳本,可以vi打開檢視源碼的。但是二者都可以運作。對于前者二進制程式我們可以直接gdb可執行檔案名稱,如gdb rpcclient直接調試。而對于後者,我們隻能通過pdb(python的單步調試方法)和 gdb結合的方式運作:
第一步,pdb可執行檔案名稱,可以參數執行的程序号;
第二步,通過ps –aux檢視執行的程序号;
第三步,gdbattach程序号進行調試。
2、gdb常用參數
這個可以參考網絡上有網友總結的很詳細的版本。我列舉下自己用的比較多的,抛磚引玉一下。
序号 | 單步調試指令 | 簡寫 | 釋義 |
---|---|---|---|
1 | run | r | 運作 |
2 | stop | 暫停程式執行 | |
3 | break | b | 設定斷點,可用形式(b檔案名:行号 / b行号) |
4 | continue | c | 繼續,直至下一個斷點 |
5 | step | s | 在某個函數斷點處,執行s可以步入該函數單步調試 |
6 | next | n | 執行到目前子產品下的下一條指令 |
7 | enable | 使得斷點有效(enable斷點号) | |
8 | disable | 使斷點無效(disable斷點号) | |
9 | delete | 删除斷點(delete斷點号) | |
10 | clear | 清除斷點 | |
11 | ignore | 忽略斷點(ignore斷點号忽略斷點次數) | |
12 | list | l | 顯示目前執行程式的代碼行,預設10行,可手動修改 |
13 | info | 比如: info break可以檢視目前所有斷點資訊 | |
14 | p | 列印參數資訊(p參數/變量名/數組成員/結構體成員) | |
15 | ptype/whatis | 顯示資料類型 | |
16 | backtrace | bt | 檢視調用堆棧資訊 |
17 | command | 在break後加command,會提示輸入資訊:此時類似一個腳本程式,你可以輸入想要在斷點處列印的資訊,輸入quit退出。(非常适合看循環單步調試的資訊,不用每次手動輸入) | |
18 | search text | 至上往下搜尋,顯示在目前檔案中包含text的代碼行 | |
19 | reverse-search text | 至下往上搜尋,顯示包含text的代碼行 | |
20 | attach | attach加程序号,程序相關調試 | |
21 | kill | 結束目前的調試 | |
22 | quit | 退出debug |
注意點:對于含參數指令的單步調試方法,比如rpcclient –U administrator%123456 –c “dsgetncchanges” 192.168.123.1,指令為rpcclient,後面的都是參數。這時候我們可以先運作gdb rpcclient ,此時調試并沒有運作,可以通過run –U administrator%123456 –c “dsgetncchanges” 192.168.123.1進入調試運作狀态,加斷點調試等。
3、開源代碼gdb之我的思考
在開源代碼中,當我們不知道要break哪裡才能有找到我們需要的的代碼行或者代碼片段時,我們可以結合以下幾點定位:
第1點:結合列印日志資訊,從中提取搜尋關鍵詞,放入代碼中搜尋,便于定位斷點區域;
第2點:根據參考文檔(自帶的或者官網上的),鎖定我們調試的代碼行;
第3點:沒有可供參考的文檔,隻有源碼,我們可以根據函數名或者檔案名猜測其可能在的區域,在可能的區域多加幾個斷點試試。
4、結語
gdb相關調試博大精深,需要在實踐中揣摩,有了它,我們的靜谧的源碼才能動起來,動起來才能更利于我們源碼的進一步深入分析。
推薦閱讀:
【1】開源代碼分析技巧之一——列印調用邏輯
http://blog.csdn.net/laoyang360/article/details/12676131【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作者:銘毅天下
轉載請标明出處,原文位址:
http://blog.csdn.net/laoyang360/article/details/14102181