【问题标题】:How to see which line of code "next" would execute in gdb?如何查看在 gdb 中执行的哪一行代码“下一个”?
【发布时间】:2011-07-25 15:51:20
【问题描述】:

在gdb中调试一些代码时,我想看看如果我说nextstep会执行哪一行。

  • 当然我可以说l,但如果我说l 几次(不记得多少次),那么l 不会打印将要执行的行。
  • 我还可以滚动到上次 gdb 停止的时间,看看它在哪一行,但这有时需要挖掘一堆输出。

我想知道我是否在 gdb 中遗漏了一个简单的命令,它显示了调试器停止的当前行?

【问题讨论】:

    标签: debugging gdb


    【解决方案1】:

    你可以使用

    列出 *$eip

    或更短的形式

    l *$eip

    这将指示 gdb 打印当前程序计数器附近的源代码行。

    【讨论】:

    • T: 我看到了 $rip 寄存器,但没有看到 $eip?你的意思是p 而不是lp $eip 给出 voidp *$eip 告诉我我正在尝试获取非指针值的内容。
    • @Yogi 如果您使用 64 位处理器,程序计数器将是 $rip 而不是 $eip。试试list *$rip。需要寄存器前的星号;它告诉 gdb 将该值视为地址。
    • 是的,这确实给了我行号。谢谢!顺便说一句,我刚刚注意到info frame 也会打印出这些信息。我希望我能接受两个答案!
    • @yogi 很高兴能帮上忙。虽然您不能接受 2 个答案,但您可以投票 :)
    • $pc$eip$rip 的简写——GDB 将替换任何正确的寄存器。也适用于其他平台。
    【解决方案2】:

    要查看调试器停止的当前行,您可以使用不带参数的farme 命令。这达到了与update 命令相同的效果。它适用于tui 和命令行模式。

    【讨论】:

      【解决方案3】:

      你可以说l +0;当前行将是列出的第一行。

      命令l +offset 列出从当前行的offset 行开始的代码。

      请注意,如果您已经使用过list 命令,则当前行将发生变化,即不再是下一个执行行。所以这只适用于你的第一个list 命令。

      【讨论】:

      • mkcs,在执行l一堆之后,“当前行”发生了变化,但是接下来要执行的行没有变化。给出一堆l 命令不会改变接下来将执行哪一行。或者不使用 GNU gdb Red Hat Linux (6.5-37.el5_2.2rh)
      • @Yogi:你是对的。这就是我所说的“当前行将不再是下一个执行行”的意思。 (我在发布答案之前测试了l +0,但我重新测试了它,它似乎不起作用。我很困惑。)
      • @Yogi:好的,因为该命令只会在您第一次运行时才运行,我现在意识到我的回答对您毫无用处。对不起。
      • 感谢您的宝贵时间。 :-)
      【解决方案4】:

      听起来您想在Emacs(它将显示当前文件并标记当前行)、DDDtui 模式下运行GDB

      【讨论】:

      • 我以前从未使用过 TUI 模式,但我现在要研究一下。看起来很有用。 :-)
      • tui 模式很棒。我一直想要这样的东西,但不知道它的存在。我知道 DDD,但我通常在远程服务器上调试,而 DDD 需要 X 显示。所以,tui 模式很棒。谢谢提供信息。顺便说一句,tui 模式下的update 命令可以解决我的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多