【问题标题】:Remove all hardware watchpoints in Linux kernel 3.0.0删除 Linux 内核 3.0.0 中的所有硬件观察点
【发布时间】:2012-05-15 08:19:05
【问题描述】:

在 GDB 中通过watch varname 设置第一个(也是唯一可能的)硬件观察点后,无法通过删除将其删除。

即使我只是退出 GDB,这个观察点似乎在下次重新启动之前都已启用。当我在 GDB 重新启动后尝试设置另一个硬件观察点时,日志中会出现一条内核消息,告诉我,所有硬件观察点都已被占用。似乎和 Setting GDB hardware watchpoint/how to set software watchpoint 中的问题一样,但是因为我需要一个硬件观察点,所以该解决方案不适用。

是否有工具或系统调用来删除这个(或所有)硬件观察点? CPU 是 Core i5,Linux 内核是来自 Ubuntu 11.10 (Oneiric Ocelot) 的 3.0.0-17-generic。

【问题讨论】:

  • 这听起来像一个错误。 gdb 使用 ptrace 添加/删除硬件断点。因此,您可以尝试在 strace 下运行 gdb 并查找与硬件断点相关的 ptrace 调用,希望它能给您一些关于正在发生的事情的线索。此外,请确保您运行的是最新的内核和 gdb。尝试上游内核是另一种选择。
  • 您如何尝试删除它,会发生什么?您是否尝试过最新的 gdb (7.4)?
  • 感谢您的帮助 - 我今天将内核升级到 3.0.0-19,现在我可以创建多个硬件观察点,并且它们会在 gdb 关闭时自动删除。

标签: linux gdb breakpoints watchpoint


【解决方案1】:

通过 gdb 中的 watch varname 设置第一个(也是唯一可能的)硬件观察点后,无法通过 delete 将其删除。

上述说法是错误。是什么让你断定这是真的?

是否有工具或系统调用可以删除这个(或所有)硬件观察点?

不需要这样的工具。只需退出 GDB,所有断点和观察点都将消失。或者执行(gdb) delete(不指定断点),并确认您要全部删除。

【讨论】:

  • 抱歉,我无法重现该行为。今天更新到 3.0.0-19 后,一切似乎都很好。
【解决方案2】:

使用观察点(有时称为数据断点)。它可以把它当作普通断点处理,如下:

(gdb) info watchpoints
Num     Type           Disp Enb Address            What
2       acc watchpoint keep y                      x

(gdb) delete 2

(gdb) info watchpoints
No watchpoints.
(gdb)

一个很好的参考是Setting Watchpoints。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多