【发布时间】:2011-07-25 15:51:20
【问题描述】:
在gdb中调试一些代码时,我想看看如果我说next或step会执行哪一行。
- 当然我可以说
l,但如果我说l几次(不记得多少次),那么l不会打印将要执行的行。 - 我还可以滚动到上次 gdb 停止的时间,看看它在哪一行,但这有时需要挖掘一堆输出。
我想知道我是否在 gdb 中遗漏了一个简单的命令,它显示了调试器停止的当前行?
【问题讨论】:
在gdb中调试一些代码时,我想看看如果我说next或step会执行哪一行。
l,但如果我说l 几次(不记得多少次),那么l 不会打印将要执行的行。 我想知道我是否在 gdb 中遗漏了一个简单的命令,它显示了调试器停止的当前行?
【问题讨论】:
你可以使用
列出 *$eip
或更短的形式
l *$eip
这将指示 gdb 打印当前程序计数器附近的源代码行。
【讨论】:
p 而不是l? p $eip 给出 void 和 p *$eip 告诉我我正在尝试获取非指针值的内容。
$rip 而不是 $eip。试试list *$rip。需要寄存器前的星号;它告诉 gdb 将该值视为地址。
info frame 也会打印出这些信息。我希望我能接受两个答案!
$pc 是$eip 或$rip 的简写——GDB 将替换任何正确的寄存器。也适用于其他平台。
要查看调试器停止的当前行,您可以使用不带参数的farme 命令。这达到了与update 命令相同的效果。它适用于tui 和命令行模式。
【讨论】:
你可以说l +0;当前行将是列出的第一行。
命令l +offset 列出从当前行的offset 行开始的代码。
请注意,如果您已经使用过list 命令,则当前行将发生变化,即不再是下一个执行行。所以这只适用于你的第一个list 命令。
【讨论】:
l一堆之后,“当前行”发生了变化,但是接下来要执行的行没有变化。给出一堆l 命令不会改变接下来将执行哪一行。或者不使用 GNU gdb Red Hat Linux (6.5-37.el5_2.2rh)
l +0,但我重新测试了它,它似乎不起作用。我很困惑。)
听起来您想在Emacs(它将显示当前文件并标记当前行)、DDD 或tui 模式下运行GDB。
【讨论】:
tui 模式很棒。我一直想要这样的东西,但不知道它的存在。我知道 DDD,但我通常在远程服务器上调试,而 DDD 需要 X 显示。所以,tui 模式很棒。谢谢提供信息。顺便说一句,tui 模式下的update 命令可以解决我的问题。