一、编译带调试信息的程序
开始调试之前,必须用程序中的调试信息编译要调试的程序。gdb 才能够调试所使用的变量、代码行和函数。
对于普通程序,在 gcc(或 g++)下使用额外的 '-g' 选项来编译程序:
gcc -g main.c
但是对于内核来说,需要更改的是 .config 文件。
推荐使用 menuconfig 进行图形化配置
cd LinuxKernel #进入源代码根目录
make menuconfig # 执行menuconfig
在menuconfig中配置compile the kernel with debug info。
保存配置然后重新编译内核使其带调试信息
kernel hacking—>
Compile-time checks and compiler options --->
[*]compile the kernel with debug info
可能出现的问题
make menuconfig错误
recipe for target 'menuconfig' failed
安装依赖库
sudo apt-get install ncurses-dev
终端显示太小
scripts/kconfig/mconf Kconfig
Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
scripts/kconfig/Makefile:24: recipe for target 'menuconfig' failed
make[1]: *** [menuconfig] Error 1
Makefile:541: recipe for target 'menuconfig' failed
make: *** [menuconfig] Error 2
直接将终端最大化
二、GDB连接内核
2.1、安装qemu
sudo apt install qemu
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu # 使用i386架构的qemu
2.2、执行内核
menuOS内核
qemu-kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
MyKernel内核
qemu -kernel arch/x86/boot/bzImage -s -S
# 关于-s和-S选项的说明
#-S freeze CPU at startup
#-s shorthandfor-gdb tcp::1234若 不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
2.3、启动gdb并连接
另开一个shell窗口
gdb
(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接
(gdb)breakstart_kernel # 断点的设置可以在target remote之前,也可以在之后
(gdb)continue # 让qemu上的Linux继续运行
2.4、 查看源码
gdb中通过 tui 可以查看源代码。
(gdb)tui enable
(gdb) layout split
(gdb) layoout regs
四、使用emas gdb
按照教程配置完成emacs。
启动emacs
gdbtool vmlinux
只是界面不同于gdb,使用方法相同