GDB+QEMU调试
https://aeneag.xyz
微信公众号:技术乱舞
艾恩凝调试virginOS
代码会写,调试也要会,本文参考链接https://time.geekbang.org/column/article/469046前段时间面试过程中发现自己调试没有用过gdb,那么实战出真知
手写操作系统目录
首先来一下配置调试后成功的结果
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是告诉编译器去掉符号信息,现在需要使用符号信息,那么把这个去掉
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
至此,执行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结
手写操作系统目录
则移山填海之难,
终有成功之日!
——孙文