BIND9源碼學習筆記1---gdb調試篇

來源:互聯網
上載者:User

標籤:

  學習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調試篇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.