我想知道当涉及到代码和实现时,DIG(域信息收集器)命令是如何工作的。我的意思是,当我们输入DIG命令时,FreeBSD或BIND中的代码的哪一部分首先出现。
当前,我看到当我按下DIG命令时,我看到该控件将转到文件client.c。在此文件中,以下函数称为:
静态无效 client_request(isc_task_t * task,isc_event_t * event);
但是,即使我深入研究了BIND代码的“命名”部分,控制如何到达这个地方仍然是一个谜。
此外,我看到此文件中的两个位置都调用了此函数。我试图将日志放到这样的地方,以了解控制权是否通过这些路径到达了这个地方,但是不幸的是这没有发生。看来“ Client_request()”函数是从外面我无法弄清楚的地方调用的。
这里有人可以帮我解决这个谜吗?
谢谢。
答案 0 :(得分:1)
借助FreeBSD Ports系统,您可以在启用调试的情况下编译自己的BIND。为此,请运行
cd /usr/ports/dns/bind913/ && make install clean WITH_DEBUG=1
然后,您可以在调试器(lldb /usr/local/bin/dig
)中运行它,在感兴趣的行上中断,然后查看backtrace以找出控件如何到达那里。
答案 1 :(得分:1)
不仅对于bind
,而且对于任何其他命令,在FreeBSD中,您都可以使用ktrace,它很冗长,但可以帮助您快速了解程序的方式表现。
例如,在最新的FreeBSD中,您拥有drill
命令而不是dig
,因此,如果您想在运行命令时知道幕后发生的事情,可以尝试: / p>
# ktrace drill freebsd.org
然后禁用跟踪:
# ktrace -C
一旦在进程上启用了跟踪,将记录跟踪数据,直到 进程退出或清除跟踪点。追踪过程 可以快速生成大量日志数据;强烈 建议用户在尝试执行以下操作之前先记住如何禁用跟踪功能: 跟踪过程。
运行ktrace drill freebsd.org
后,应创建一个文件ktrace.out
,您可以使用kdump
来读取它,例如:
# kdump -f ktrace.out | less
这有望“揭开谜底”,在您的情况下,只需将drill
替换为dig
,然后使用类似的方法即可
# ktrace dig freebsd.org