Как работает утилита DIG в FreeBSD и BIND?

Я хочу знать, как на самом деле работает команда 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()» каким-то образом вызывается откуда-то извне, что я не могу понять.

Есть ли здесь кто-нибудь, кто может помочь мне решить эту загадку для меня?

Спасибо.


person user3552519    schedule 14.09.2018    source источник
comment
Вы спрашиваете/отлаживаете dig или named? (dig просто отправляет DNS-запрос по сети на указанный сервер)   -  person nos    schedule 14.09.2018
comment
@nos Я хочу знать, куда именно достигает элемент управления в named, пока я даю команду «копать». Как я уже объяснил, в настоящее время я вижу элемент управления, начинающийся с функции client_request() в файле client.c. Но как именно он туда попадает и откуда, я не могу понять.   -  person user3552519    schedule 16.09.2018
comment
Ваш вопрос очень расплывчатый. URL-адрес, который вы указываете, не имеет отношения к dig, командной строке (named и dig — это две разные вещи). Вместо этого посмотрите на ftp.isc .org/isc/bind9/9.9.0rc1/bind-9.9.0rc1/bin/dig/dig.c В любой программе на C ОС сначала вызывает функцию main, а затем все, что там происходит, диктует ход выполнения программы. См. строку 1820 и далее в предыдущей ссылке.   -  person Patrick Mevzek    schedule 18.09.2018


Ответы (2)


Не только для bind, но и для любой другой команды в FreeBSD можно использовать ktrace, это очень многословно, но может помочь вам получить краткий обзор того, как ведет себя программа.

Например, в последних версиях FreeBSD у вас есть команда drill вместо dig поэтому, если вы хотите знать, что происходит за кулисами, когда вы запускаете команду, вы можете попробовать:

# ktrace drill freebsd.org

Затем, чтобы отключить трассировку:

# ktrace -C

Как только трассировка включена для процесса, данные трассировки будут регистрироваться до тех пор, пока либо процесс не завершится, либо точка трассировки не будет очищена. Отслеживаемый процесс может быстро генерировать огромные объемы данных журнала; Настоятельно рекомендуется, чтобы пользователи запомнили, как отключить трассировку, прежде чем пытаться отслеживать процесс.

После запуска ktrace drill freebsd.org должен быть создан файл ktrace.out, который можно было бы прочитать с помощью kdump, например:

# kdump -f ktrace.out | less

Надеюсь, это «раскроет тайну», в вашем случае просто замените drill на dig, а затем используйте что-то вроде:

# ktrace dig freebsd.org
person nbari    schedule 17.10.2018
comment
Вы также можете сделать это с помощью dig, используя порт bind-tools. - person Lucas Holt; 19.10.2018

Благодаря системе портов FreeBSD вы можете скомпилировать свой собственный BIND с включенной отладкой. Для этого запустите

cd /usr/ports/dns/bind913/ && make install clean WITH_DEBUG=1

Затем вы можете запустить его в отладчике (lldb /usr/local/bin/dig), разбить интересующую вас строку, а затем посмотреть на обратную трассировку, чтобы выяснить, как туда попал элемент управления.

person arrowd    schedule 14.09.2018