DIG实用程序如何在FreeBSD和BIND中工作?

时间:2018-09-14 09:41:49

标签: dns bind freebsd named dig

我想知道当涉及到代码和实现时,DIG(域信息收集器)命令是如何工作的。我的意思是,当我们输入DIG命令时,FreeBSD或BIND中的代码的哪一部分首先出现。

当前,我看到当我按下DIG命令时,我看到该控件将转到文件client.c。在此文件中,以下函数称为:

静态无效 client_request(isc_task_t * task,isc_event_t * event);

但是,即使我深入研究了BIND代码的“命名”部分,控制如何到达这个地方仍然是一个谜。

此外,我看到此文件中的两个位置都调用了此函数。我试图将日志放到这样的地方,以了解控制权是否通过这些路径到达了这个地方,但是不幸的是这没有发生。看来“ Client_request()”函数是从外面我无法弄清楚的地方调用的。

这里有人可以帮我解决这个谜吗?

谢谢。

2 个答案:

答案 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