FreeBSD предусматривает упрощенную возможность управления и отладки выполнения процесса. Эта возможность, доступ к которой осуществляется посредством системного вызова ptrace, позволяет родительскому процессу контролировать выполнение
Порожденного процесса, манипулируя состоянием выполнения режимов пользователя и ядра. В частности, с помощью ptrace родительский процесс может выполнить в отношении порожденного процесса следующие операции:
- присоединиться к существующему процессу, чтобы начать его отладку; читать и записывать в адресное пространство и регистры; перехватывать сигналы, отправляемые процессу; осуществлять пошаговое выполнение и возобновление выполнения процесса; завершить выполнение процесса.
Вызов ptrace почти исключительно используется отладчиками программ, такими, как gdb.
При трассировке процесса все отправляемые процессу сигналы заставляют его войти в состояние STOPPED. Родительский процесс уведомляется с помощью сигнала SIGCHLD и может запросить состояние порожденного процесса с помощью системного вызова wait4. На большинстве машин исключения-ловушки трассировки (trace traps), генерируемые при пошаговом выполнении процесса, и исключения-отказы точек останова (breakpointfaults)1, вызываемые выполнением процессом инструкции точки останова, преобразуются FreeBSD в сигналы SIGTRAP. Поскольку сигналы, отправляемые трассируемому процессу, заставляют его остановиться и вызывают уведомление родителя, выполнение программы можно легко контролировать.
Чтобы запустить программу, которую нужно отладить, отладчик сначала создает порожденный процесс с помощью системного вызова fork. После разветвления (fork) порожденный процесс использует вызов ptrace, который вызывает пометку процесса как трассируемого посредством установки бита PJTRACED в поле p_flag структуры процесса. Порожденный процесс устанавливает затем бит ловушки трассировки в слове состояния процессора для процесса и вызывает execve, чтобы загрузить образ программы для отладки. Установка этого бита гарантирует, что первая выполненная порожденным процессом инструкция после загрузки нового образа приведет к аппаратному исключению-ловушке трассировки, которое преобразуется системой в сигнал SIGTRAP. Поскольку родительский процесс уведомляется обо всех сигналах порожденному процессу, он может перехватить сигнал и получить управление программой до того, как она выполнит первую инструкцию.
В качестве альтернативы отладчик может взять управление над существующим процессом путем присоединения к нему. Успешный запрос присоединения заставляет процесс войти в состояние STOPPED, а в поле p_flag его структуры процесса будет установлен бит PTRACED. Затем отладчик может действовать в отношении процесса тем же самым способом, как в случае с явным его запуском.
Альтернативой системному вызову ptrace является файловая система. Возможности, предоставляемые файловой системой, те же самые, которые предоставляет ptrace; они отличаются лишь по интерфейсу. Файловая система реализует представление системной таблицы процессов внутри файловой системы и называется так, потому что обычно монтируется в файловую систему. Она предоставляет двухуровневое представление пространства процессов. На высшем уровне названы сами процессы в соответствии с их ID процессов. Имеется также особый узел, который называется curproc и который всегда ссылается на процесс, осуществляющий запрос поиска.
Полный образ виртуальной памяти процесса. Можно получить доступ лишь к тем адресам, которые существуют в процессе. Чтение и запись в этот файл изменяют процесс. Записи в сегмент текста остаются частными для процесса. Поскольку доступ к адресному пространству другого процесса можно получить с помощью системных вызовов read и write, отладчик может получить доступ к отлаживаемому процессу с гораздо большей эффективностью, чем при помощи системного вызова ptrace. Представляющие интерес страницы в отлаживаемом процессе отображаются в адресное пространство ядра. Данные, запрошенные отладчиком, можно потом скопировать непосредственно из ядра в адресное пространство отладчика.
Дает возможность получить доступ для чтения или записи набора регистров процесса.
Файл только для чтения, содержащий текущие и максимальные ограничения процесса.
Status Состояние процесса. Этот файл только для чтения, он возвращает одну строку, содержащую несколько разделенных пробелами полей, включающих имя команды, ID процесса, ID родительского процесса, ID группы процесса, ID сеанса, управляющий терминал (если имеется), список флагов процесса, время запуска процесса, системное и пользовательское время, сообщение канала ожидания и мандаты процесса.
Владельцем каждого узла является пользователь процесса, группой - первичная группа пользователя, за исключением узла тет, который принадлежит группе ктет.
В обычном отладочном окружении, когда целевой процесс выполняет fork, за которым следует exec отладчика, отладчику следует выполнить fork, а порожденный процесс должен остановиться (например, послав себе SIGSTOP). Родитель должен вызвать команды wait, а затем attach через соответствующий файл ctl. Порожденный процесс получит SIGTRAP сразу после вызова exec.
- 22/10/2010 20:29 - Ограничения тюрьмы
- 22/10/2010 16:02 - Реализация тюрьмы
- 22/10/2010 11:30 - Семантика тюрьмы
- 19/10/2010 04:06 - Тюрьмы
- 17/10/2010 19:25 - Управление заданиями