QEMU & GDB 调试内核

目录

  • 简介
    • 文件的分布
      • 编译内核
      • 修改config配置
      • 编译
    • 运行
      • gdb 开始调试
  • 调试技巧
      • 断点
      • 显示
        • 输出变量
  • 参考资料

简介

本篇文章用来QEMU & GDB 调试内核使用

文件的分布


ROOT=/root/runlinux/Chapter1

ROOTFS=$ROOT/fs
ROOTFS_IMG=$ROOT/rootfs.img
ROOTFS_IMG_MOUNT=/mnt/rootfs

KERNEL_ROOT=$ROOT/linux-4.0
KERNEL_IMG=$KERNEL_ROOT/arch/arm/boot/zImage
KERNEL_DTB=$KERNEL_ROOT/arch/arm/boot/dts/vexpress-v2p-ca9.dtb

编译内核

首先修改Makefile 文件中的架构以及编译工具链

# ARCH		?= $(SUBARCH)
ARCH 		?= arm
# CROSS_COMPILE	?= $(CONFIG_CROSS_COMPILE:"%"=%)
CROSS_COMPILE	?= arm-linux-gnueabi-

以及 将 优化等级修改为 -O1

ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
KBUILD_CFLAGS	+= -O1 $(call cc-disable-warning,maybe-uninitialized,)
else
KBUILD_CFLAGS	+= -O1
endif

最开始是想修改为 -O0 的,但是编译出现了问题。就只好修改为 -O1。区别不是太大。

修改config配置

root@zhou 12:03:35 ~/r/C/linux-4.0 # make vexpress_defconfig
root@zhou 12:03:48 ~/r/C/linux-4.0 # make menuconfig
#   Kernel hacking  --->
#       Compile-time checks and compiler options  --->
#           [*] Compile the kernel with debug info

编译

make bzImage -j2
make dtbs

运行

生成最小文件系统的步骤,暂时略过。大致的思路就是,制作一个镜像。然后将其格式化为 一个 ext3的文件系统镜像。其他的格式也可以。

    qemu-system-arm -M vexpress-a9 -smp 4 -m 100M -kernel $KERNEL_IMG \
    -dtb $KERNEL_DTB -nographic \
    -append "root=/dev/mmcblk0 rw rdinit=/linuxrc console=ttyAMA0 loglevel=8 slub_debug kmemleak=on" \
    -sd $ROOTFS_IMG \
    -S -s
    # -S 表示 QEMU 将会冻结虚拟机
    # -s 表示在 1234端口接收 GDB的调试

gdb 开始调试

root@zhou 14:27:57 ~ # apt-get install gdb-multiarch
root@zhou 14:28:06 ~ # cd runlinux/Chapter1/linux-4.0
# 在次文件夹下面拥有 vmlinux  文件
root@zhou 23:47:06 ~/r/C/linux-4.0 # gdb-multiarch vmlinux 
(gdb) set architecture arm
(gdb) target remote localhost:1234
(gdb) b start_kernel

调试技巧

断点

# 指定某文件夹下面的断点
(gdb) b path/to/filename: line
(gdb) b path/to/filename: funcation
(gdb) b funcation
(gdb) info b 
(gdb) delet index[1~Unlim]

显示

输出变量

(gdb) print ret

参考资料

  • gdb调试技巧
  • gdb命令调试技巧
  • gdb 调试利器
  • Linux 系统内核的调试
  • Linux内核调试的方式以及工具集锦
  • 宋宝华: 关于Linux编译优化几个必须掌握的姿势
  • 没有GCC优化,Linux无法编译。暗示?[关闭]
  • GCC_optimization
  • 很经典的GDB调试命令,包括查看变量,查看内存
  • Debugging the Linux Kernel
  • 使用GNU编译器集合(GCC)

你可能感兴趣的:(linux,gdb,qemu,linux)