Try   HackMD

Debug DNS dig on Mac m1

想要了解 dig 是如何運作的,所以下載了 dig source code
查看了一下目前使用的版本

$ dig -v DiG 9.18.25

把下載後的版本設為 9.18.25

$ cd bind9 $ git checkout v9.18.25

接著根據文件 doc/arm/build.inc.rst開始編譯,為了要 debug 需要 -g

$ autoreconf -fi $ CFLAGS="-g" ./configure $ make

編譯完設定 launch.json
一開始設定 program 路徑是 ${workspaceFolder}/bin/dig/dig
後來發現那是一個 script
需要改成 ${workspaceFolder}/bin/dig/.libs/dig
並根據 script 的提示,加上 DYLD_LIBRARY_PATH,否則找不到 lib

        {
            "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(),不過已經有找到答案

; <<>> 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