简单搭建内核调试环境--N 附录[用户空间gdb 堆栈信息与内核空间视角切换]

跳转到目录 点这里 

复制 manjaro 的 initramfs

cp -a /boot/amd-ucode.img /kernel-debug/qemu.img/old
cp -a /boot/initramfs-5.8-x86_64.img /kernel-debug/qemu.img/old
cp -a /boot/initramfs-5.8-x86_64-fallback.img /kernel-debug/qemu.img/old

替换成自己编译的内核启动 OK

#因为自己的内核里面己经编译了 ide 的块设备驱动,所以直接用原来的 initramfs (里面的驱动用不了,没关系)
#为了识别为 ide 硬盘要指定 -drive 参数  if=ide
#uuid 是 gdb.qcow2 分区之后建立文件系统时生成的
qemu -kernel /kernel-debug/linux-5.9.8/arch/x86_64/boot/bzImage -append "root=UUID=6cc81cd1-d453-43a7-8b72-78b0b5650427 rw  quiet apparmor=1 security=apparmor udev.log_priority=3" -initrd /kernel-debug/qemu.img/old/initramfs-5.8-x86_64.img -net nic,macaddr=52:54:00:12:34:22,model=e1000 -net tap,ifname=tap0,script=/etc/qemu-ifup-nat,downscript=/etc/qemu-ifdown-nat -net nic,macaddr=52:54:00:12:34:23,model=pcnet -m 5120 -boot c -drive file=/gdb/gdb.qcow2,if=ide,media=disk,snapshot="off",format=qcow2

下一步,在Qemu 打开的系统中写个用户程序来调试。

Makefile 

basePath=.
cc=gcc 

testOBJ = test.o
#************************************ all target  ************************************************************************* 
all:  cl  init test exec cl2
#************************************ serlver target  ***************************************************************** 
test:$(testOBJ)
    $(cc) $(testOBJ) -o $@
$(testOBJ): %.o: %.c
    $(cc) -g -c $< -o $@
#************************************ other  Target ************************************************************************* 
init:
    echo hello 
exec:
    echo 'exec test'
    ./test
cl:
    rm -rf ./*.o
    rm -rf ./test
cl2:
    rm -rf ./*.o

示例代码: test.c

#include <stdio.h>

#define LENGTH 100
int main(int argc, char* argv[])
{
    FILE *fd;
    char str[LENGTH];
    fd = fopen("hello.txt", "w+"); /* 创建并打开文件 */
    if (fd)
    {
        fputs("Hello, Software Weekly", fd); /* 写入Hello, software weekly字符串 */
        fclose(fd);
    }
    
    fd = fopen("hello.txt", "r");
    fgets(str, LENGTH, fd); /* 读取文件内容 */
    printf("%s
", str);
    fclose(fd);
    return 0;
}

关闭qemu ,加上调试参数重新启动 OK

 qemu -gdb tcp::8888 -S -kernel /kernel-debug/linux-5.9.8/arch/x86_64/boot/bzImage -append "root=UUID=6cc81cd1-d453-43a7-8b72-78b0b5650427 rw  quiet apparmor=1 security=apparmor udev.log_priority=3" -initrd /kernel-debug/qemu.img/old/initramfs-5.8-x86_64.img -net nic,macaddr=52:54:00:12:34:22,model=e1000 -net tap,ifname=tap0,script=/etc/qemu-ifup-nat,downscript=/etc/qemu-ifdown-nat -net nic,macaddr=52:54:00:12:34:23,model=pcnet -m 5120 -boot c -drive file=/gdb/gdb.qcow2,if=ide,media=disk,snapshot="off",format=qcow2

.gdbinit 中加入 do_sys_open 断点来调试打开文件这个系统调用

b start_kernel
b do_sys_open

启动 eclipse 进行调试,eclipse配置前面说过 点这里跳转

先放行断点,再切到 qemu里面的系统进行用户空间程序调试

再用gdb调试,一直next 直到打开文件那行

然后再选中 VMware Manjaro中 eclipse 中的do_sys_open断点,再回到 qemu 里面,进行 next

自己也可以把原来的包解出来,把自己的驱动打进去。

写个脚本: re_Packge.sh 

#-------------解压----------------
mkdir -p /kernel-debug/qemu.img/new/amd-ucode
cd /kernel-debug/qemu.img/new/amd-ucode
cpio -ivmd < /kernel-debug/qemu.img/old/amd-ucode.img
#-------------解压----------------
mkdir -p /kernel-debug/qemu.img/new/cpio
cp -a /kernel-debug/qemu.img/old/initramfs-5.8-x86_64.img /kernel-debug/qemu.img/new/cpio/initramfs-5.8-x86_64.gz
mkdir -p /kernel-debug/qemu.img/new/initramfs-5.8-x86_64
gunzip /kernel-debug/qemu.img/new/cpio/initramfs-5.8-x86_64.gz
cd /kernel-debug/qemu.img/new/initramfs-5.8-x86_64
cpio -ivmd < /kernel-debug/qemu.img/new/cpio/initramfs-5.8-x86_64
#-------------解压----------------
mkdir -p /kernel-debug/qemu.img/new/cpio
cp -a /kernel-debug/qemu.img/old/initramfs-5.8-x86_64-fallback.img /kernel-debug/qemu.img/new/cpio/initramfs-5.8-x86_64-fallback.gz
mkdir -p /kernel-debug/qemu.img/new/initramfs-5.8-x86_64-fallback
gunzip /kernel-debug/qemu.img/new/cpio/initramfs-5.8-x86_64-fallback.gz
cd /kernel-debug/qemu.img/new/initramfs-5.8-x86_64-fallback
cpio -ivmd < /kernel-debug/qemu.img/new/cpio/initramfs-5.8-x86_64-fallback
#-------------压缩----------------
mkdir -p /kernel-debug/qemu.img/new/out
find /kernel-debug/qemu.img/new/amd-ucode -print | cpio -cov > /kernel-debug/qemu.img/new/amd-ucode.img
mv /kernel-debug/qemu.img/new/amd-ucode.img /kernel-debug/qemu.img/new/out/amd-ucode.img
#-------------压缩----------------
mkdir -p /kernel-debug/qemu.img/new/out
find /kernel-debug/qemu.img/new/initramfs-5.8-x86_64-fallback -print | cpio -cov > /kernel-debug/qemu.img/new/initramfs-5.8-x86_64-fallback.img
gzip /kernel-debug/qemu.img/new/initramfs-5.8-x86_64-fallback.img
mv /kernel-debug/qemu.img/new/initramfs-5.8-x86_64-fallback.img.gz /kernel-debug/qemu.img/new/out/initramfs-5.8-x86_64-fallback.img
#-------------压缩----------------
find /kernel-debug/qemu.img/new/initramfs-5.8-x86_64 -print | cpio -cov > /kernel-debug/qemu.img/new/initramfs-5.8-x86_64.img
gzip /kernel-debug/qemu.img/new/initramfs-5.8-x86_64.img
mv /kernel-debug/qemu.img/new/initramfs-5.8-x86_64.img.gz /kernel-debug/qemu.img/new/out/initramfs-5.8-x86_64.img
#-----------------------------
cd /kernel-debug/qemu.img/new/out

换成新打的包试一下: (暂时没有成功,可能是前面打包命令有问题)

qemu -kernel /kernel-debug/linux-5.9.8/arch/x86_64/boot/bzImage -append "root=UUID=6cc81cd1-d453-43a7-8b72-78b0b5650427 rw  quiet apparmor=1 security=apparmor udev.log_priority=3" -initrd /kernel-debug/qemu.img/new/out/initramfs-5.8-x86_64.img -net nic,macaddr=52:54:00:12:34:22,model=e1000 -net tap,ifname=tap0,script=/etc/qemu-ifup-nat,downscript=/etc/qemu-ifdown-nat -net nic,macaddr=52:54:00:12:34:23,model=pcnet -m 5120 -boot c -drive file=/gdb/gdb.qcow2,if=ide,media=disk,snapshot="off",format=qcow2

——

原文地址:https://www.cnblogs.com/heling/p/14159161.html