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