方法
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)
(gdb)x/32xb $1+1
第乙個說明node節點,可以看到節點資料資訊
第二個顯示附屬字段資訊,即記錄資訊
分析
named_g_server->viewlist是乙個鍊錶,儲存相關的view,head指向了乙個view
named_g_server->viewlist->head->zonetable->table->root->data是乙個zone組成的樹結構中,data儲存了zone,
**((dns_rbtdb_t )((dns_zone_t ) named_g_server->viewlist->head->zonetable->table->root->data)->db)將zone->db轉為對應的型別,可以分析rbtdb的內部資料
**((dns_rbtdb_t )((dns_zone_t ) named_g_server->viewlist->head->zonetable->table->root->data)->db)->tree->root->down->data問題rbtdb是樹結構,每個node儲存兩個資料,node附屬資料是記錄資訊,data儲存記錄的rdata
出現過錯誤,顯示位址不可訪問,經過排查是對應的zone沒有載入成功總結
bind9使用封裝方法是將對外結構轉內部型別的方式,將內部的元素的相關操作隱藏,實現的解耦。
舉個簡單的例子
內部實現如下typedef struct a;
int ***(a *param);
typedef struct a_a;
int ***(a *param)
BIND9原始碼分析奠基
因為從事的是dns方面的工作,而且也很想學習高效能伺服器的知識,所以學習bind9的實現既能兼顧工作又可以學到高效能伺服器的知識。一是市面上bind9原始碼分析的資料太少了,而且 量又很大,所以對於像我這樣的新手來說入門門檻實在太高,所以想把自己的總結分享出來,幫助那些新人。by the way,我...
BIND9原始碼分析之UDP資料處理
本文簡要介紹一下bind9中的udp資料處理,包括如何建立socket 設定什麼socket引數 多執行緒環境中如何讓多個執行緒讀取53埠的資料等等。bind9的架構採用event driven和task based。對於像tcp這樣的事件採用event driven來等待讀寫時間,而在多執行緒方面...
BIND9原始碼學習筆記1 gdb除錯篇
學習bind9原始碼之前,首先要知道如何用gdb來除錯bind。bind9的原始碼我是先看 弄懂它的架構,像什麼event drive,epoll等,再去看它的業務流程。看業務流程的時候要追蹤它的資料流和處理過程,所以用gdb比較好,當然自己加日誌再結合bind9自有的日誌也不是不 行,只是覺得這樣...