Debug DNS dig on Mac m1
===
想要了解 dig 是如何運作的,所以下載了 [dig source code](https://github.com/isc-projects/bind9)
查看了一下目前使用的版本
```shell=
$ dig -v
DiG 9.18.25
```
把下載後的版本設為 9.18.25
```shell=
$ cd bind9
$ git checkout v9.18.25
```
接著根據文件 `doc/arm/build.inc.rst`開始編譯,為了要 debug 需要 `-g`
```shell=
$ autoreconf -fi
$ CFLAGS="-g" ./configure
$ make
```
編譯完設定 `launch.json`
一開始設定 `program` 路徑是 `${workspaceFolder}/bin/dig/dig`
後來發現那是一個 script
需要改成 `${workspaceFolder}/bin/dig/.libs/dig`
並根據 script 的提示,加上 `DYLD_LIBRARY_PATH`,否則找不到 lib
```jsonld
{
"type": "lldb",
"request": "launch",
"name": "dig",
"program": "${workspaceFolder}/bin/dig/.libs/dig",
"args": [
"www.google.com"
],
"cwd": "${workspaceFolder}",
"env": {
"DYLD_LIBRARY_PATH": "/Users/dennishuang/workspace/code/bind9/lib/isc/.libs:/Users/dennishuang/workspace/code/bind9/lib/dns/.libs:/Users/dennishuang/workspace/code/bind9/lib/isccfg/.libs:/Users/dennishuang/workspace/code/bind9/lib/irs/.libs:/Users/dennishuang/workspace/code/bind9/lib/bind9/.libs:/Users/dennishuang/workspace/code/bind9/lib/ns/.libs:$DYLD_LIBRARY_PATH"
}
}
```
做完上述設定,在 vscode 執行 debug,執行到 `isc_app_ctxrun` 會觸發 `UNREACHABLE()`,不過已經有找到答案
```shell=
; <<>> DiG 9.18.25 <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58484
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.com. IN A
;; ANSWER SECTION:
www.google.com. 149 IN A 172.217.160.68
;; Query time: 3 msec
;; SERVER: fe80::f01f:c7ff:fe60:d564%27#53(fe80::f01f:c7ff:fe60:d564%27%27) (UDP)
;; WHEN: Wed May 01 17:27:41 CST 2024
;; MSG SIZE rcvd: 59
app.c:236: INSIST(unreachable) failed, back trace
0 libisc-9.18.25.dylib 0x000000010058b724 default_callback + 72
1 libisc-9.18.25.dylib 0x000000010058b690 isc_assertion_failed + 56
2 libisc-9.18.25.dylib 0x000000010058a5dc isc_app_ctxrun + 1560
3 libisc-9.18.25.dylib 0x000000010058a938 isc_app_run + 176
4 dig 0x0000000100007ae8 dig_startup + 88
5 dig 0x0000000100007bf0 main + 72
6 dyld 0x0000000199e820e0 start + 2360
```
執行的 function `ns__client_request`
使用 epoll 模型
# Ref
http://www.cppblog.com/zhangyq/archive/2010/12/20/136419.html