【问题标题】:Set breakpoint on every line in GDB在 GDB 中的每一行设置断点
【发布时间】:2012-11-16 05:21:29
【问题描述】:

有没有办法在 GDB 代码的每一行设置断点?显然我不想在每一行都打b *addr,所以我想知道是否有一种快速的方法来做到这一点。

编辑 请注意,我正在运行由其他人创建的二进制文件,并且我无权访问源代码。不幸的是,该二进制文件没有使用 -g 标志编译。因此,我不能单步执行代码中的每一行。

进一步编辑 正如 Jason 在下面指出的那样,只要您使用 sini,您确实可以单步执行代码,而不是简单地使用 s(步骤)或 n(下一步)。 ns 工作正常,但如果源代码已使用 -g 编译,但它会逐步执行源代码行,而不是逐步执行每个汇编指令,如 nisi do in在没有 -g 的情况下编译的二进制文件。

【问题讨论】:

标签: gdb


【解决方案1】:

使用si (stepi) 指示单步执行代码。您可以使用ni (nexti) 跳过您不感兴趣的库函数。如果您不小心踏入其中之一,finish 应该会让您回到原来的例程。在这个级别工作的人通常将 gdb 设置为显示接下来将要执行的几条指令,例如disp/3i $pc.

【讨论】:

  • 哇,这么简单的解决方案。我使用的是 n 和 s,而不是 ni 或 si。完美运行。我很好奇 GDB 如何解释 ni vs n。此外, disp/3i $pc 也非常有用。
  • next 使用来自调试信息的源行信息来确定源行的地址范围。第 10 行可能从 0x100 到 0x116,因此调试器(在幕后)执行每条指令的指令,直到 pc 为 0x116。复杂性包括进入另一个函数或离开当前函数(返回命令、longjmp、抛出异常),在这种情况下您想要停止执行。当调试器进入子例程调用时,它会在原始函数上设置断点并继续。幕后发生了很多事情。 ni 级别较低。
【解决方案2】:

您不能将断点放在执行的第一行,然后逐行执行吗?这取决于你试图通过在每一行上设置断点来实现什么。如果你想计算表达式,你可以按照我的逻辑来做(逐行)。

【讨论】:

  • 好点。你是对的,但我忘了说我正在运行一个未使用 -g 标志编译的二进制文件。我也无权访问源代码,因此无法使用 -g 重新编译。不幸的是,这并没有让我一步到位。为了清楚起见,已对问题进行了编辑
【解决方案3】:

PowerPC 具有对范围断点的硬件支持,而 GCB 提供:

break-range start end

在那拱门里。所以我认为你可以中断整个内存地址,或者整个文本部分(未经测试)。

该命令在 x86 上失败。

文档:https://sourceware.org/gdb/onlinedocs/gdb.html#index-break_002drange-1548

【讨论】:

    猜你喜欢
    • 2014-09-22
    • 2021-04-01
    • 2014-07-03
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2012-03-29
    相关资源
    最近更新 更多