Flame_Sam 2024-04-15 11:33 采纳率: 0%
浏览 10

qemu+gdb调试内核中断行为

如题所述,本人在qemu上搭了个32位linux,跑应用程序。然后通过gdb来调试应用程序运行过程中的内核行为。
从抓到main的时刻开始,在各个中断,异常,调度,返回用户态的位置设置断点。

随后gdb continue,就一直循环卡在时钟中断处,循环触发。

  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-15 11:33
    关注

    引自免费微信小程序:皆我百晓生

    要在QEMU中使用GDB调试Linux内核中断行为,你需要遵循以下几个步骤:

    1. 安装并配置QEMU和GDB: 确保已经安装了QEMU和GDB。如果你还没有安装,可以参考官方文档进行安装。

    2. 编译带调试信息的内核: 下载Linux内核源码,并编译一个带有调试信息的内核。在make menuconfig中,选择Kernel hacking -> Kernel debugging support,然后保存并退出。执行make -j$(nproc)make modules_install来构建和安装内核。

    3. 启动QEMU与GDB连接: 启动QEMU时,使用以下命令将内核映像、根文件系统映像以及GDB附加到内核:

    qemu-system-i386 -s -S -kernel vmlinux -initrd initrd.img -append "console=ttyS0 earlyprintk loglevel=8" -m 512M -cpu qemu32 -hda rootfs.img
    

    这里 -s 开启串口仿真,-S 停留在启动前,等待GDB连接。

    1. 连接GDB: 打开一个新的终端,连接到正在运行的QEMU实例:
    (gdb) target remote :1234
    

    这里的:1234是默认的QEMU串口端口号,可能需要根据实际情况调整。

    1. 设置断点: 进入GDB后,设置你想要的断点,例如在schedule()函数(处理调度的地方)设置断点:
    (gdb) break kernel/sched/core.c:schedule
    
    1. 继续执行: 设置好断点后,继续执行QEMU:
    (gdb) c
    
    1. 观察中断行为: 程序会暂停在你设置的断点上。你可以查看寄存器状态,内存,堆栈等信息,分析中断行为。例如,查看当前CPU上下文:
    (gdb) info registers
    (gdb) x/10i $pc
    
    1. 断点操作: 如果你想在其他地方设置断点,比如某个特定中断处理程序,可以在GDB中添加新的断点:
    (gdb) break drivers/irqchip/ia32/apic.c:handle_IRQ
    
    1. 继续观察和调试: 每次中断发生时,GDB都会暂停。你可以检查寄存器值,内存,调用堆栈等,了解中断处理过程。如果要继续执行,再次输入c

    2. 结束调试: 完成后,可以使用quit命令退出GDB。

    注意:这个过程可能会有些复杂,因为中断处理涉及到很多内核细节。理解这些细节需要深入学习Linux内核的工作原理。此外,上述步骤适用于通用场景,具体实现可能因内核版本的不同而略有差异。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月15日

悬赏问题

  • ¥15 共享文件夹会话中为什么会有WORKGROUP
  • ¥15 关于#python#的问题:使用ATL02数据解算光子脚点的坐标(操作系统-windows)
  • ¥115 关于#python#的问题:未加密前两个软件都可以打开,加密后只有A软件可打开,B软件可以打开但读取不了数据
  • ¥15 在matlab中Application Compiler后的软件无法打开
  • ¥15 想问一下STM32创建工程模板时遇到得问题
  • ¥15 Fiddler抓包443
  • ¥20 Qt Quick Android 项目报错及显示问题
  • ¥15 而且都没有 OpenCVConfig.cmake文件我是不是需要安装opencv,如何解决?
  • ¥15 oracleBIEE analytics
  • ¥15 H.264选择性加密例程