Чего я хочу добиться
Я хочу настроить образ GRUB EFI и отлаживать его во время работы в QEMU.
Итак, я пытаюсь отладить ванильный образ GRUB перед его настройкой.
Что я сделал до сих пор
Я загрузил GRUB2 с http://git.savannah.gnu.org и скомпилировал его:
./autogen.sh
./configure --prefix=`pwd`/local --with-platform=efi --target=i386 CFLAGS=-g
make
make install
Затем сгенерировал тривиальное изображение EFI с:
./local/bin/grub-mkstandalone -O i386-efi -o bootIA32.efi
И поместите его в файл образа диска:
qemu-img create -f raw hda.img 1G
mkfs.fat hda.img
sudo mount -o uid=$UID hda.img /mnt
mkdir -p /mnt/efi/boot/
mv bootIA32.efi /mnt/efi/boot/
sudo umount /mnt
Чтобы загрузить его, я скомпилировал IA32 OVMF.fd, чтобы использовать его с QEMU:
qemu-system-i386 -bios $UDK_PATH/Build/OvmfIa32/RELEASE_GCC48/FV/OVMF.fd \
-hda hda.img
Он загружается правильно, давая мне оболочку grub.
Где я застрял
Теперь я хочу отладить GRUB. Поэтому я вызвал QEMU с дополнительными параметрами:
qemu-system-i386 -bios $UDK_PATH/Build/OvmfIa32/RELEASE_GCC48/FV/OVMF.fd \
-hda hda.img \
-s -S
И прикрепил gdb к QEMU:
cd grub-core/
gdb -x gdb_grub
Однако кажется, что символы отладки отсутствуют:
GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1
(...)
For help, type "help".
Type "apropos word" to search for commands related to "word".
0x0000fff0 in grub_disk_cache_table ()
Breakpoint 1 at 0x49b1: file kern/dl.c, line 53.
(gdb) n
Single stepping until exit from function grub_disk_cache_table,
which has no line number information.
0xffffff75 in ?? ()
(gdb)
Что я делаю неправильно?
После добавления символов
@unixsmurf, похоже, загружает символы отладки, когда я использую команду symbol-file
. Действительно, GDB говорит
(gdb) symbol-file ../local/lib/grub/i386-efi/kernel.exec
Reading symbols from ../local/lib/grub/i386-efi/kernel.exec...done.
Однако я все еще не могу выполнить команду next
, которая возвращает
(gdb) n
Single stepping until exit from function grub_disk_cache_table,
which has no line number information.
0xffffff75 in ?? ()
Я бы хотел, например, установить точку останова в функции grub_core/kern/main.c:grub_main
и запускать ее шаг за шагом.
Но хотя точка останова установлена, когда я continue
выполнение, GRUB достигает оболочки, не останавливаясь на точке останова:
(gdb) b main.c:grub_main
Note: breakpoint 2 also set at pc 0x6082.
Breakpoint 3 at 0x6082: file kern/main.c, line 266.
(gdb) c
Continuing.