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

2021-09-12 03:37:54 字數 1263 閱讀 6160

方法

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自有的日誌也不是不 行,只是覺得這樣...