BIND9原始碼學習筆記1 gdb除錯篇

2021-08-07 08:20:30 字數 1117 閱讀 7866

學習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原始碼分析奠基

因為從事的是dns方面的工作,而且也很想學習高效能伺服器的知識,所以學習bind9的實現既能兼顧工作又可以學到高效能伺服器的知識。一是市面上bind9原始碼分析的資料太少了,而且 量又很大,所以對於像我這樣的新手來說入門門檻實在太高,所以想把自己的總結分享出來,幫助那些新人。by the way,我...

BIND9原始碼分析之UDP資料處理

本文簡要介紹一下bind9中的udp資料處理,包括如何建立socket 設定什麼socket引數 多執行緒環境中如何讓多個執行緒讀取53埠的資料等等。bind9的架構採用event driven和task based。對於像tcp這樣的事件採用event driven來等待讀寫時間,而在多執行緒方面...

bind9原始碼分析 檢視A記錄的資料組織

方法 gdb除錯時,如下可以看到某一node節點資料,gdb p rdatasetheader t dns rbtdb t dns zone t named g server viewlist head zonetable table root data db tree root down data...