远程 gdb 调试无法停在断点处。

7

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

  1. GDB 7.6
  2. QEMU 1.6.5
  3. Linux内核3.11.0

我的系统是英特尔(R) Core(TM) i7-2760QM CPU @ 2.40GHz运行Ubuntu 12.10。

我使用'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正在调试运行的内核?你在哪里设置端口“1234”?我以前没有使用过qemu,但如果可以的话,请尝试启用KGDB/KDB并通过串行连接运行内核。 - srd
我使用-s和-S标志。Qemu启动并等待gdb连接到默认端口-1234。只有当我在gdb侧按下继续按钮时,Qemu才恢复执行。因此,gdb和Qemu之间的连接良好... - Noamiko
2个回答

7

好的,我找到了问题并在这里发布以供其他人参考:

显然这是一个非常微妙的过程...我的配置文件没问题。我所需要做的就是在连接到qemu之后定义断点,而不是在加载vmlinux之后。这些断点必须是硬件断点......否则它们不会触发!


1
如果你还在关注这个问题,请更新一下回答并提供一个例子好吗?“...只有在连接到qemu之后,而不是在加载vmlinux之后”这句话的意思不太清楚。谢谢! - larsks
这意味着你必须先将gdb连接到qemu,然后再定义断点... 如果你按相反的顺序做 - 你会看到告诉你断点已设置的消息,但什么也不会发生,它根本不起作用。 - Noamiko

0
不匹配的符号也会导致这个问题。例如:您正在从主机端的vmlinux加载符号,但它与调试对象不相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接