我想知道DIG(Domain Information Groper)命令在代码和实现方面是如何工作的 . 我的意思是当我们输入DIG命令时,FreeBSD或BIND中的哪部分代码首先命中 .
目前,我看到当我点击DIG命令时,我看到控件转到文件client.c . 在此文件中,调用以下函数:
static void client_request(isc_task_t * task,isc_event_t * event);
但是,即使在对BIND代码的“命名”部分进行了大量挖掘后,控制如何到达这个地方仍然是一个很大的谜团 .
此外,我看到这个函数是从这个文件中的两个地方调用的 . 我试图将日志放入这些地方以了解控制是否通过这些路径到达这个地方,但不幸的是,这不会发生 . 似乎“Client_request()”函数以某种方式从外部调用,我无法弄清楚 .
这里有谁能帮我解决这个谜团给我?
谢谢 .
2 回答
感谢FreeBSD Ports系统,您可以在启用调试的情况下编译自己的BIND . 这样做跑
然后你可以在调试器(
lldb /usr/local/bin/dig
)中运行它,打破你感兴趣的行,然后查看backtrace以找出控件是如何到达那里的 .不仅对于
bind
而且对于任何其他命令,在FreeBSD中你可以使用ktrace,它非常冗长,但可以帮助你快速了解程序的行为方式 .例如,在最新的FreeBSD中你有drill命令而不是
dig
所以如果你想知道运行命令后幕后发生了什么,你可以尝试:然后禁用跟踪:
运行
ktrace drill freebsd.org
后,应创建一个文件ktrace.out
,您可以使用kdump创建一个文件,例如:希望"reveal the mystery",在你的情况下,只需用
dig
替换drill
然后使用类似的东西: