• 简单搭建内核调试环境--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

    ——

  • 相关阅读:
    c++类的大小
    c++面向对象的程序设计
    c++拷贝控制
    vsftpd出现“Response: 500 OOPS: cannot change directory”解决方法(转载)
    CentOS 安装 MRTG 软件完成后的 403 Forbidden(转载)
    Linux服务器 /var/spool/clientmqueue 目录下产生大量文件的删除办法
    mysql修改端口经验
    yum install mysql(转载)
    yum install tomcat
    yun install java
  • 原文地址:https://www.cnblogs.com/heling/p/14159161.html
Copyright © 2020-2023  润新知