Удаленная отладка gdb на исходном уровне (реализация простого ядра ОС)

Linux

Недавно я учусь писать простое ядро ​​​​операционной системы, для которого требуется инструмент отладки. Здесь мы используем 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: Установить файл таблицы символов для чтения

Добро пожаловать в мойблога такжеgithub!