Отладка пользовательской ОС с помощью QEMU

Я пытаюсь написать простую ОС, я уже написал загрузчик, но теперь хочу его отладить, поэтому я переключился с использования VirtualBox на QEMU, потому что увидел, что у него лучше отладка. Проблема в том, что после того, как я добавил параметр -s в команду QEMU и успешно подключился через GDB, он говорит, что таблица символов не загружена и что я должен использовать команду «файл». Единственное отличие от того, что я сделал, от того, что я видел в Интернете, заключается в том, что они запускали GDB с gdb vmlinux, но я не могу этого сделать, потому что я не отлаживаю ядро ​​​​Linux... поэтому я решил, что проблема в том, что я не запускал GDB с исполняемым файлом, но с помощью команды «файл» в образе моей ОС и скомпилированного и связанного файла .out сообщает мне, что это «загрузочный сектор DOS/MBR», поэтому я не могу запустить GDB с любым из них (я все равно пытался это сделать, но GDB потерпел неудачу).

Помощь приветствуется.

РЕДАКТИРОВАТЬ: также я собрал загрузчик с параметрами -g и --gstabs+.


person Tal K    schedule 13.08.2018    source источник


Ответы (1)


gdb нужен файл, чтобы он мог дать вам символическую отладочную информацию. Для этого вам нужно будет предоставить ему файл в формате с отладочной информацией, который соответствует тому, где ваша ОС оказывается в ОЗУ. Файл «загрузочного сектора DOS/MBR» представляет собой образ диска (BIOS загрузит часть этого в ОЗУ для вас, а затем, предположительно, завершит загрузку самого кода).

Но gdb также с радостью позволит вам выполнять отладку на уровне сборки; вы можете просто проигнорировать предупреждение об отсутствии таблицы символов и использовать пошаговую инструкцию, дизассемблировать с компьютера и подобные команды:

  • "disas $pc,+32" дизассемблирует 32 байта текущего ПК
  • команда display печатается после остановки выполнения, поэтому "disp /3i $pc" будет печатать следующие 3 инструкции каждый раз, когда gdb получает управление
  • «stepi» и «nexti» выполняют шаг/следующий шаг с одной инструкцией («шаг» и «следующий» являются пошаговым выполнением исходной строки и требуют отладочной информации)
person Peter Maydell    schedule 13.08.2018
comment
Спасибо за ответ, но GDB не распознает команду disassemble-from-pc, и я не могу сделать шаг, потому что GDB не может найти границы текущей функции... есть предложения? - person Tal K; 13.08.2018
comment
«разобрать» — это команда; 'помощь разобрать' дает помощь. Вы можете дизассемблировать с ПК, задав ему начало и длину, например, disas $pc,+32 дизассемблирует 32 байта. Также полезна команда display, которая печатает после остановки выполнения: disp /3i $pc будет печатать следующие 3 insns каждый раз, когда gdb получает управление. Вам нужно использовать stepi и nexti, которые выполняют шаг/следующий шаг с одним insn, а не шаг и следующий, которые являются шагами исходной строки. - person Peter Maydell; 13.08.2018
comment
Прохладно; Я отредактировал свой ответ, чтобы более конкретно указать команды, которые работают без отладочной информации. - person Peter Maydell; 13.08.2018