linux-kernel - 远程 gdb 调试不会在断点处停止

标签 linux-kernel operating-system gdb qemu gdbserver

我在调试修改后的 Linux-3.11.0 内核时遇到问题。
为了调试代码,我使用:

  • GDB 7.6
  • QEMU 1.6.5
  • Linux 内核 3.11.0

  • 我的系统有运行 Ubuntu 12.10 的 Intel(R) Core(TM) i7-2760QM CPU @ 2.40GHz

    我使用'make menuconfig'创建的配置文件编译了修改后的内核。 (在“内核黑客”类别中进行了修改)

    此处引用了一些 .config 文件行(我认为相关):
    CONFIG_DEBUG_INFO=y 
    CONFIG_DEBUG_KERNEL=y
    CONFIG_MAGIC_SYSRQ=y
    CONFIG_DEBUG_FS=y
    CONFIG_HAVE_HW_BREAKPOINT=y
    CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
    

    我使用带有“-S”选项的 qemu 来启动我的内核,并使用 gdb 连接到 qemu 并恢复它的执行:
    (gdb) target remote :1234
    (gdb) continue
    

    设置断点时,例如:break schedule我收到一条确认消息,例如:
    Breakpoint 1 at 0xffffffff81736400: file kernel/sched/core.c, line 2509.
    

    所以直到这里一切似乎都很好!

    问题是 gdb 和 qemu 不会停在断点处!
    他们都只是继续奔跑……

    我尝试按照某些地方的建议设置硬件断点,但收到消息:
    No hardware breakpoint support in the target.
    

    这很奇怪,因为我设置了 CONFIG_HAVE_HW_BREAKPOINT。

    我也取消设置 CONFIG_DEBUG_RODATA正如其他地方所建议的那样,但仍然没有结果......

    我试图按照此处的建议处理 .config 文件:gdbserver inside qemu does not stop on breakpoints 但我无法弄清楚工作 .config 文件和我的 .config 文件之间的相关差异......(差异太多了!)

    谁能帮帮我吗?

    谢谢你!!

    最佳答案

    好的,我发现了问题,所以我在这里发布给其他人:
    显然这是一个非常微妙的过程......我的配置文件很好。我需要做的只是在我连接到 qemu 之后定义断点,而不是在加载 vmlinux 之后。这些断点必须是硬件断点……否则它们不会中断!

    关于linux-kernel - 远程 gdb 调试不会在断点处停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18931727/

    相关文章:

    python - "Operation not permitted"关于使用 os.setuid() [python]

    c - while 查看 switch 语句的内部(双重中断)

    gdb - 从 GDB 中的 Fortran 多态派生数据类型中打印值

    linux - ARM Linux 上的 "Backtrace stopped: previous frame identical to this frame (corrupt stack?)"

    memory-management - current-> mm在Linux内核中为NULL

    c-copy_to_user : how to read a struct type value of kernel space in the user space?

    assembly - 在从中断处理程序返回之前,我是否必须弹出某些异常推送到堆栈的错误代码?

    assembly - 汇编中的异或语句

    linux-kernel - 使用 g++ 编译 Linux 内核

    linux-kernel - 交叉编译内核模块: invalid module format