天天看點

開源代碼分析技巧之二——gdb單步調試

前言

在海量的源碼面前,如何更好的切入到源碼,鎖定我們需要的那一行,有時顯得格外重要。

而通常來講,我們知道源碼包,或多或許我們也同時有一些參考文檔(可能不全),并且知道源碼能提供的一些功能。比如以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 print 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