Отладка процессов

FreeBSD предусматривает упрощенную возможность управления и отладки выполнения процесса. Эта возможность, доступ к которой осуществляется посредством системного вызова ptrace, позволяет родительскому процессу контролировать выполнение порожденного процесса, манипулируя состоянием выполнения режимов пользователя и ядра. В частности, с помощью ptrace родительский процесс может выполнить в отношении порожденного процесса следующие операции:

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

Вызов ptrace почти исключительно используется отладчиками программ, такими, как gdb.

При трассировке процесса все отправляемые процессу сигналы заставляют его войти в состояние STOPPED. Родительский процесс уведомляется с помощью сигнала SIGCHLD и может запросить состояние порожденного процесса с помощью системного вызова wait4. На большинстве машин исключения-ловушки трассировки (trace traps), генерируемые при пошаговом выполнении процесса, и исключения-отказы точек останова (breakpoint faults)1, вызываемые выполнением процессом инструкции точки останова, преобразуются FreeBSD в сигналы SIGTRAP. Поскольку сигналы, отправляемые трассируемому процессу, заставляют его остановиться и вызывают уведомление родителя, выполнение программы можно легко контролировать.

Чтобы запустить программу, которую нужно отладить, отладчик сначала создает порожденный процесс с помощью системного вызова fork. После разветвления (fork) порожденный процесс использует вызов ptrace, который вызывает пометку процесса как трассируемого посредством установки бита P_TRACED в полеp_flag структуры процесса. Порожденный процесс устанавливает затем бит ловушки трассировки в слове состояния процессора для процесса и вызывает execve, чтобы загрузить образ программы для отладки. Установка этого бита гарантирует, что первая выполненная порожденным процессом инструкция после загрузки нового образа приведет к аппаратному исключению-ловушке трассировки, которое преобразуется системой в сигнал SIGTRAP. Поскольку родительский процесс уведомляется обо всех сигналах порожденному процессу, он может перехватить сигнал и получить управление программой до того, как она выполнит первую инструкцию.

В качестве альтернативы отладчик может взять управление над существующим процессом путем присоединения к нему. Успешный запрос присоединения заставляет процесс войти в состояние STOPPED, а в поле p_flag его структуры процесса будет установлен бит PTRACED. Затем отладчик может действовать в отношении процесса тем же самым способом, как в случае с явным его запуском.

Альтернативой системному вызову ptrace является файловая система /ргос. Возможности, предоставляемые файловой системой /ргос, те же самые, которые предоставляет ptrace; они отличаются лишь по интерфейсу. Файловая система /ргос реализует представление системной таблицы процессов внутри файловой системы и называется так, потому что обычно монтируется в /ргос. Она предоставляет двухуровневое представление пространства процессов. На высшем уровне названы сами процессы в соответствии с их ID процессов. Имеется также особый узел, который называется curproc и который всегда ссылается на процесс, осуществляющий запрос поиска.

Еще материалы

  • Учет использования ресурсов -

    Система поддерживает простую форму учета использования ресурсов. По завершении каждого процесса учетная запись, описывающая использованные этим процессом ре­сурсы, записывается в системный файл учета.

  • Идентификаторы и SETID -

    FreeBSD реализует возможность setgid путем установки в нулевом элементе мас­сива дополнительных групп процесса, который выполняет программу setgid, значения группы этого файла. После этого можно проверять права доступа, как если бы это был обычный процесс. Из-за дополнительной группы программа setgid может иметь воз­можность доступа к большему количеству файлов, чем процесс пользователя, запус­кающий программу без этой особой привилегии.

  • Идентификаторы (Часть 2) -

    Часто пользователю нужно предоставить дополнительные ограниченные привиле­гии. Например, пользователь, который хочет отправить сообщение, должен иметь воз­можность добавить сообщение в почтовый ящик другого пользователя. Разрешение записи в почтовый ящик назначения для всех пользователей дало бы возможность пользователю, не являющемуся владельцем ящика, изменять в нем сообщения (злона­меренно или неумышленно). Чтобы решить эту проблему, ядро допускает создание программ, которым предоставляются при их выполнении дополнительные привиле­гии.

  • Корректировка времени и интервальное время -

    Часто желательно на всех машинах сети поддерживать одно и то же время. Можно также поддерживать более точное время, чем возможно от базовых часов процессора. Например, без труда доступно оборудование, прослушивающее ряд радиостанций, рассылающих в Соединенных Штатах синхронизирующие сигналы UTC. Когда про­цессы на различных машинах приходят к соглашению относительно общего времени, им нужно изменить часы процессора своего хоста, чтобы согласовать их с сетевым значением времени.

  • Службы времени -

    Ядро предоставляет процессу несколько различных служб времени. Эти службы включают таймеры, работающие в реальном режиме, и таймеры, работающие лишь во время выполнения процесса.