標籤:
學習bind9源碼之前,首先要知道如何用gdb來調試bind。BIND9的源碼我是先看代碼弄懂它的架構,像什麼event-drive,epoll等,
再去看它的商務程序。看商務程序的時候要追蹤它的資料流和處理過程,所以用gdb比較好,當然自己加日誌再結合BIND9自有的日誌也不是不
行,只是覺得這樣更清晰。
編譯bind的時候加的有-g和-O2選項,前者不用說了,後者很坑爹的,用gdb調試時會發現代碼的實際執行順序會有所改變,這是編譯器的最佳化。
編譯器的最佳化有三級,-O2就是二級最佳化的意思,扯遠了,總之是去掉比較好吧,我自己調試時是沒去的,習慣了。
一步步來:
1.gdb named
gdb>set args -g -n1 -d5
set args就是設定程式的運行參數,- g就是說前台運行,可以看到列印的日誌等資訊,-n是指worker線程的個數(這個要是不懂就看另外一篇,BIND9
的架構與機制(-_-還沒寫....)),這個很重要,本來的工作是按照順序執行的,那麼列印的日誌也必然是按照順序列印出來,一一匹配,如A->B->C->D,
如果worker線程個數大於1的話,那麼很可能另外一個線程先把事C執行列印了日誌,而此時可能B在執行日誌還沒列印,看到的日誌順序就和業務處理的
邏輯順序不一樣了,可能看到的日誌順序就感覺莫名其妙。-d就是bind的自有調試記錄,5就是等級,bind的日誌我沒有咋看,有很多宏如CTRACE,FTRACE,
函數ns_client_log(不知道是不是這個,也可能記錯了)等,-5應該就滿足所有等級的要求,其內部的列印都會列印出來。大部分是函數的開頭或結尾列印一下。
gdb>b client_request
這個是設定斷點,斷點為client_request,之所以設定這一個就是因為bind是事件驅動的,而受到查詢或者是其它(notify等)訊息,執行的第一個函數即為此,
即所有的dns報文的處理入口都是client_request。
gdb>r
那麼程式就開始了。
2.set print pretty on,設定列印結構體,好看一點....
print /x ###列印比如sockaddr_in這種,由於位元組序的不同,看十進位的數不如看16進位的。
其它都是gdb的基本操作了
BIND9源碼學習筆記1---gdb調試篇