gdb调试
目的:复现jyy的调试过程
直接执行make debug会报错,显示no file问题就是boot里的文件是bootblock.o而不是boot.o,所以在其Makefile里添加
复制一份,如何就再次执行make debug 就会出现新的bug
1 gdb.error: "/home/cgz/work/os-workbench/abstract-machine/am/src/x86/qemu/boot/boot.o" : not in executable format: file format not recognized
显示格式不能识别,问gpt回答为该种格式不能直接调试,需要启动qemu,连接调试,事实也是这样,
问题不是这个。所以就是Makefile里缺少-ggdb
需要-ggdb提供调试信息,gdb才能调试可执行文件
在
1 abstract-machine/am/src/x86/qemu/boot/Makefile
添加-ggdb可以同时解决打印不出来的问题,不实现stdio里的printf函数也能打印
设置$AM_HOME为pa的框架,改写Makefile不起作用
但是改写为直接clone的
1 /home/cgz/work/os-workbench/abstract-machine/am/src/x86/qemu/boot/Makefile
就能正常使用printf,但是用make debug还是没有标记
1 gdb.error: "/home/cgz/work/os-workbench/abstract-machine/am/src/x86/qemu/boot/boot.o": not in executable format: file format not recognized
造成这个的原因是在文件上没有gdb可以识别的标记
解决方法应该是加上-ggdb应该就可以
但是还是报错没有标记,把bulid生成的.o文件全部删除,再执行也一样。
尝试把py程序代码手动输入,看看能否解决
1 2 3 4 debug: qemu-system-i386 -s -S -machine accel=tcg -smp "1,sockets=1" \ -drive format=raw,file=build/hello-x86-qemu & gdb -x debug.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 def on_quit (): gdb.execute('kill' ) gdb.events.exited.connect(on_quit) gdb.execute('target remote localhost:1234' ) am_home = os.environ['AM_HOME' ] path = f'{am_home} /am/src/x86/qemu/boot/boot.o' gdb.execute(f'file {path} ' ) gdb.Breakpoint('_start' ) gdb.Breakpoint('start32' ) gdb.execute('continue' )
提取出命令
1 2 3 4 5 6 7 8 9 10 11 qemu-system-i386 -s -S -machine accel=tcg -smp "1,sockets=1" -drive format=raw,file=build/hello-x86-qemu & //打开虚拟机文件夹 gdb am/src/x86/qemu/boot/boot.o target remote localhost:1234 //然后打断点执行 (gdb)b _start (gdb)b start 32 (gdb)c
同样的报错
已解决
把Makefile的两行交换位置即可
1 2 3 4 5 6 7 8 9 SRCS := start.S main.c bootblock.o: $(SRCS) Makefile @echo + CC $(SRCS) @$(CROSS_COMPILE) gcc -ggdb -static -m32 -fno-pic -Os -nostdlib -Ttext 0x7c00 -I$(AM_HOME) /am/src -o bootblock.o $(SRCS) cp bootblock.o boot.o @python3 genboot.py bootblock.o clean: rm -rf *.o