GDB+QEMU调试

https://aeneag.xyz
微信公众号:技术乱舞
艾恩凝

调试virginOS
代码会写,调试也要会,本文参考链接https://time.geekbang.org/column/article/469046

前段时间面试过程中发现自己调试没有用过gdb,那么实战出真知

手写操作系统目录

首先来一下配置调试后成功的结果
092000.png

GDB+QEMU动态调试内核,这也是调试linux内核的方法

QEMU安装

方法一:

1sudo apt-get install qemu-system

方法二:

https://blog.csdn.net/OnlyLove_/article/details/122646605

QEMU启动内核

1aen$  qemu-system-x86_64 -drive format=raw,file=hd.img -m 512M -cpu kvm64,smep,smap -s    // 一定要加-s参数,此参数可以打开调试服务。

制作带调试符号的 elf 文件

1. 改bug

多余的话不多说,首先解决一个bug,工程文件initldr/ldrkrl/chkcpmm.c中,init_mem()函数中,最后调用的init_acpi()注释掉,要不然使用QEMU启动该内核会出现错误。

2. 修改编译选项

1) 修改ld -s 参数,使用-s是告诉编译器去掉符号信息,现在需要使用符号信息,那么把这个去掉
093000.png

1grep  -i -n '\-s ' .

使用sed命令去掉

1sed -i 's/-s / /g' ./initldr/build/krnlbuidcmd.mh ./script/krnlbuidcmd.S

2) GCC 的**-O2参数要修改成O0 -g**参数,根本原因不能让编译器优化程序,防止跟踪程序找不到

./build/pretreatment.mkf 中

1CPPFLGSLDS	= $ (HEADFILE_PATH) -E -P      ----->    CPPFLGSLDS	= $ (HEADFILE_PATH) -O0 -g -E -P

./script/krnlbuidcmd.S:13 中

1CFLAGS      = $(HEADFILE_PATH) -c -O2 -m64      ----->    CFLAGS      = $(HEADFILE_PATH) -c -O0 -g -m64

./initldr/build/krnlbuidcmd.mh 中 BTCFLAGS CFLAGS CPPFLGSLDS

去掉O2,添加-O0 -g
094000.png

至此,执行make就可以生成新elf文件了

制作img文件

对于这么懒的自己,怎么会多做事情,直接

1make  vboxtest

这一步直接制作完毕,何至于自己手动,完事关闭虚拟机

使用GDB调试

 1aen@aen-computer:~/os_file/e_gdb/c_virginOS_26_gdb$ gdb -q
 2(gdb) symbol-file build/v
 3vbox.mkf          virginos.bin      virginos.elf      virginos.map      virginoslink.lds  
 4(gdb) symbol-file build/virginos.elf 
 5Reading symbols from build/virginos.elf...
 6(gdb) target remote :1234
 7Remote debugging using :1234
 8warning: No executable has been specified and target does not support
 9determining executable automatically.  Try using the "file" command.
100x0000000000005624 in ?? ()
11(gdb) break copy_pages_data
12Breakpoint 1 at 0xffff8000020097d2: file ../hal/x86/memmgrinit.c, line 94.
13(gdb) b *0x04000000
14Breakpoint 2 at 0x4000000
15(gdb) b *0x04000068
16Breakpoint 3 at 0x4000068
17(gdb) c
18Continuing.
19
20Breakpoint 3, 0x0000000004000068 in ?? ()
21(gdb) c
22Continuing.
23
24Breakpoint 1, copy_pages_data (mbsp=0xffff800002727548) at ../hal/x86/memmgrinit.c:94
2594      {
26(gdb) x /3i $rip
27=> 0xffff8000020097d2 <copy_pages_data>:        endbr64 
28   0xffff8000020097d6 <copy_pages_data+4>:      push   %r15
29   0xffff8000020097d8 <copy_pages_data+6>:      push   %rbx
30(gdb) info r cr0
31cr0            0x80000011          [ PG ET PE ]

最后,写文章好像很简单的样子,前段时间被面试官鄙视只会print调试,不会GDB,拿出一天的时间入门还是可以的,虽然很多指令不会,但并不影响调试内核,真的是一回生二回熟,这简单的调试,磕磕绊绊的也是走了一上午,从安装QEMU就有坑,Ubuntu20的版本命令与低版本的貌似不太一样,安装完成后,还要注意,QEMU启动内核最好不要使用远程链接,会启动不了,因为没有gui,使用GDB的时候,target remote :1234 这条指令结束后,再启动QEMU,不知道为什么先启动内核,再使用GDB会调试不了,操作一遍,再总结一遍,调试环境就算搭建好了

菜狗有一颗卷的心,简称卷心菜

艾恩凝于2022/05/07结

手写操作系统目录


    


公众号'艾恩凝'
个人公众号
个人微信
个人微信
    吾心信其可行,
          则移山填海之难,
                  终有成功之日!
                                  ——孙文
    评论
    0 评论
avatar

取消