Недавно я учусь писать простое ядро операционной системы, для которого требуется инструмент отладки. Здесь мы используем gdb для отладки. Поскольку работа виртуальной машины и локальная машина являются двумя частями, используется технология удаленной отладки gdb. Здесь используются обычная отладка и удаленная отладка gdb.Обзор методов отладки.
Удаленная отладка
Во-первых, описание команд, используемых при отладке ядра операционной системы (некоторые make-файлы здесь опущены):
Для облегчения отладки краткое описание команд, используемых при отладке.
……
# -s 这个参数指的是启动时开启1234端口等待gdb连接
# -S 是指是启动时不自动开始运行,等待调试器的执行命令
debug: kernel.elf os-image.bin
@echo 🔨🔨🔨debug🔨🔨🔨
${QEMU} -S -s -fda os-image.bin -boot a &
i386-elf-gdb -q -ex "target remote localhost:1234" -ex "symbol-file kernel.elf"
……
Когда мы используем qemu для запуска и запуска файла образа, мы используем следующие параметры:
- -s Этот параметр указывает на открытие порта 1234 при запуске и ожидание подключения gdb.
- S означает, что он не запускается автоматически при запуске, ожидая, пока отладчик выполнит команды
В это время удаленный порт открыт, чтобы мы могли подключиться к порту для отладки позже.
При компиляции исходного кода нам нужно добавить-g
Параметры, чтобы иметь возможность компилировать информацию исходного кода в исполняемый файл.
Затем мы используем gdb для начала отладки.
-
target remote localhost:1234
подключиться к удаленному порту -
symbol-file kernel.elf
Загрузить скомпилированный исполняемый файл с информацией об исходном коде
`symbol-file можно проследить до библиотеки, предоставленной компилятором, и кода самой операционной системы
Символы отладки — это символы внутри этих кодов, базы данных символов отладки,
Записывает взаимосвязь между переменными, функциями и местом в памяти.
Таким образом, информация, связанная с адресом, может использоваться для отслеживания имен переменных, имен функций.
Затем мы можем использовать команду gdb для отладки.
Общие команды
Заказ |
объяснять |
Пример |
---|---|---|
file |
Загрузите исполняемый программный файл, который отлаживается. Поскольку GDB обычно выполняется в каталоге, где находится отлаживаемая программа, текстовое имя не обязательно должно содержать путь. | (gdb) file gdb-sample |
r |
Сокращенно от Run, запустить отлаживаемую программу. Если до этого точка останова не была установлена, выполняется вся программа; если есть точка останова, программа приостанавливается на первой доступной точке останова. | (gdb) r |
c |
Сокращение для продолжения, которое продолжает выполнение отлаживаемой программы до следующей точки останова или конца программы. | (gdb) c |
b b b б d [номер] | b: сокращение от Breakpoint, установка точки останова. Два могут использовать «номер строки», «имя функции», «адрес выполнения» и другие методы для указания местоположения точки останова. Символ «*» перед именем функции указывает, что точка останова установлена на «коде пролога, сгенерированном компилятором». Если вы не понимаете ассемблера, вы можете игнорировать это использование. d: сокращение от Удалить точку останова, удалить точку останова с указанным номером или удалить все точки останова. Номера точек останова увеличиваются с 1. | (gdb) b 8 (gdb) b main (gdb) b main (gdb) b 0x804835c (gdb) d |
s, n |
s: выполнить строку исходного кода, если в этой строке кода есть вызов функции, ввести функцию; n: выполнить строку исходного кода, и вызовы функций в этой строке кода также выполняются. В других отладчиках s эквивалентно «Шаг с шагом», а в других отладчиках n эквивалентен «Шаг вперед». Эти две команды можно использовать только при наличии информации об отладке исходного кода (используйте параметр "-g" при компиляции GCC). | (gdb) s (gdb) n |
si, ni |
Команда si аналогична команде s, а команда ni аналогична команде n. Разница в том, что эти две команды (si/ni) предназначены для инструкций по сборке, а s/n — для исходного кода. | (gdb) si (gdb) ni |
p |
Сокращение для печати, которое отображает значение указанной переменной (временной или глобальной). |
(gdb) p i (gdb) p nGlobalVar |
отображать ... не отображать |
дисплей, установите данные, которые будут отображаться, и их формат после прерывания программы. Например, если вы хотите, чтобы следующая ассемблерная инструкция выполнялась после каждого прерывания программы, вы можете использовать команду «display /i $pc», где $pc представляет текущую ассемблерную инструкцию, а /i означает отображение в шестнадцатеричном формате. Эта команда полезна, когда вам нужно позаботиться об ассемблере. undispaly, отменить предыдущие настройки отображения, число начинает увеличиваться с 1. | (gdb) display /i $pc (gdb) undisplay 1 |
i |
infoАббревиатура , которая используется для отображения различной информации.helpя". | (gdb) i r |
q |
Сокращение от quit, выход из среды отладки GDB. |
(gdb) q |
помощь [название команды] |
Команды справки GDB предоставляют пояснения к командам GDB. Если параметр «имя команды» указан, будет отображаться подробное описание команды; если параметр не указан, все команды GDB будут отображаться в категориях для дальнейшего просмотра и запроса пользователями. | (gdb) help |
варианты исполнения
- -cd: установить рабочий каталог
- -q: Тихий режим, не печатать вводную информацию и информацию о версии.
- -d: добавить путь поиска файла
- -x: выполнять команды GDB из указанного файла
- -s: Установить файл таблицы символов для чтения