Невозможно войти в исходный код системного вызова

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

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

Кроме того, я пробовал: gdb$catch syscall open

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

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

Спасибо.


person Sandeep Singh    schedule 14.05.2011    source источник
comment
Отладка в Linux реализована через системный вызов ptrace(2); ptrace может только проверять и останавливать процессы, запущенные в пространстве пользователя. Я ожидаю, что механизм отладки процессов FreeBSD аналогичен и предназначен только для работы с процессами пользовательского пространства: поскольку ядро ​​ОС будет захватывать и снимать блокировки, а также быстро реагировать на прерывания, разработка ядра, позволяющего полнофункциональную отладку из пользовательского пространства, кажется слишком сложной. вряд ли.   -  person sarnold    schedule 14.05.2011
comment
Привет Сарнольд, Спасибо за ваш комментарий. Если отладка в пользовательском пространстве невозможна, может ли kdb/kgdb служить этой цели?   -  person Sandeep Singh    schedule 14.05.2011
comment
Прошли годы с тех пор, как я заглядывал в kdb/kgdb, возможно, все резко изменилось. :) Но, возможно, это сообщение о дампах стека будет быть хорошей отправной точкой?   -  person sarnold    schedule 14.05.2011


Ответы (2)


Похоже, у вас фундаментальное непонимание того, как работают системы UNIX.

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

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

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

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

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

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

Если вы действительно хотите перейти к ядру, проще всего это сделать с помощью UML.

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

person Community    schedule 14.05.2011
comment
Ваша отладка ядра с помощью отладчика, работающего на том же компьютере, невозможна. На мой взгляд, это применимо только к kgdb в Linux. UML также является специфическим решением для Linux. Существует порт kgdb для FreeBSD, но ядро ​​FreeBSD можно отлаживать локально с помощью ddb, точно так же, как Solaris можно отлаживать с помощью kmdb. - person jlliagre; 14.05.2011
comment
Ваше объяснение причины, по которой отладчик ядра не может работать, ошибочно. Ядро — это не однопоточная программа, и даже не многопоточная. Ядро — это код, выполняемый в привилегированном контексте. Многие потоки ядра могут выполнять этот код одновременно, поэтому точка останова, влияющая на инструкцию, выполняемую одним из них, не имеет веских причин для внезапной остановки ядра, т. е. для остановки каждого другого потока ядра. - person jlliagre; 08.10.2017

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

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

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

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

person jlliagre    schedule 14.05.2011