Невозможно войти в исходный код системного вызова. - PullRequest
6 голосов
/ 14 мая 2011

Я скомпилировал исходный код libbs для freebsd с параметром -g, чтобы теперь я мог войти в функции libc.

Но я не могу войти в код системных вызовов. Я скомпилировал исходный код ядра freebsd с помощью -g. При установке точки останова GDB сообщает о точке останова в файлах .S. При достижении точки останова GDB не может войти в исходный код системного вызова.

Также я попробовал: gdb $ catch syscall open

но это тоже не работает.

Не могли бы вы предложить что-нибудь?

Спасибо.

Ответы [ 2 ]

7 голосов
/ 14 мая 2011

У вас, похоже, отсутствует понимание того, как работают системы UNIX.

Подумай об этом. Предположим, вы смогли войти в функцию ядра, которая реализует системный вызов, скажем sys_open. Итак, теперь вы смотрите на исходный код ядра для sys_open в отладчике. Вопрос в том, работает ли ядро ​​в этот момент или оно остановлено. Поскольку вы захотите сделать что-то вроде next в отладчике, давайте предположим, что ядро ​​ остановлено .

Итак, теперь вы нажимаете клавишу n, и что происходит?

Обычно ядро ​​ реагирует на прерывание, вызванное клавиатурой, выясняет, какая клавиша была нажата, и отправляет эту клавишу нужному процессу (тот, который заблокирован в read(2) от терминал, управляющий клавиатурой).

Но ваше ядро ​​ остановлено , поэтому вам не нужно нажимать клавишу.

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

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

Если вы действительно хотите войти в ядро, самый простой способ сделать это - UML .

После того, как вы поиграете с UML и поймете, как интерфейс пользовательского пространства / ядра работает и взаимодействует, вы можете попробовать kgdb, хотя настройка обычно немного сложнее. На самом деле вам не нужно иметь отдельную машину для этого, вы можете использовать VMWare, VirtualPC или VirtualBox.

3 голосов
/ 14 мая 2011

Как уже сказал Employed Russian, находящийся в пользовательской среде gdb не может проверять что-либо, работающее в ядре.

Однако ничто не мешает реализовать отладчик в самом ядре. В таком случае можно установить точки останова и пошагово запустить код ядра из локальной сессии отладки (консоли). В FreeBSD такой отладчик доступен как ddb .

Некоторыми ограничениями может быть отсутствие связи между сеансами gdb и ddb, и я не уверен, что отладка на уровне исходного кода (-g) доступна для кода ядра в FreeBSD / ddb.

Альтернативным и гораздо менее навязчивым способом «отладки» ядра из пользовательского пространства будет использование dtrace .

...