【问题标题】:gdb: how to print the current line or find the current line number?gdb:如何打印当前行或查找当前行号?
【发布时间】:2013-01-12 23:02:57
【问题描述】:

list 命令打印一组行,但我需要一行,我所在的位置以及可能发生错误的位置。

【问题讨论】:

标签: debugging gcc gdb


【解决方案1】:

我在调试时确实得到了相同的信息。虽然不是在我检查堆栈跟踪时。我认为您很可能会使用优化标志。检查这个link - 相关的东西。

尝试使用-g3 进行编译,删除任何优化标志。 那么它可能会起作用。 HTH!

【讨论】:

  • 啊,所以虽然我的程序是用-g 编译以包含调试信息,但我目前在一个堆栈框架中,取自一个共享库,显然没有编译为包含行信息。谢谢,库马尔。
  • 年度评论奖。非常感谢!
【解决方案2】:

“框架”命令将为您提供所需的内容。 (这可以缩写为“f”)。这是一个例子:

(gdb) frame
\#0  zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139         int rc = fq.recv (msg_);
(gdb)

没有参数,“框架”只会告诉你你在哪里(有参数它会改变框架)。更多frame命令信息请见here

【讨论】:

    【解决方案3】:

    请记住,gdb 是一个强大的命令 - 能够执行低级指令 - 因此与汇编概念相关。

    你要找的叫做de指令指针,即:

    指令指针寄存器指向处理器下一次尝试执行的内存地址。指令指针在 16 位模式下称为 ip,在 32 位模式下称为 eip,在 64 位模式下称为 rip。 p>

    更多详情here

    gdb 执行时可用的所有寄存器都可以显示为:

    (gdb) info registers
    

    通过它您可以找到您的程序正在运行的模式(查看这些寄存器中的哪些存在)

    然后(这里使用现在最常见的寄存器 rip,如果需要,用 eip 或很少使用 ip 替换):

    (gdb)info line *$rip
    

    将显示行号和文件源

    (gdb) list *$rip
    

    会在之前和之后向您显示该行

    但可能

    (gdb) frame
    

    在很多情况下应该足够了。

    【讨论】:

    • 我相信 GDB 不支持 16 位模式,所以这里从不使用 ip。此外,您可以使用 GDB 的别名来代替显式拼写程序计数器的名称:$pc。所以x/10i $pc 将在当前指令指针处反汇编 10 条指令,而不管架构如何——它将适用于 i386、x86_64、ARM 等。
    【解决方案4】:

    可以使用whereframe命令。 where 命令将提供函数名称的更多信息

    【讨论】:

      【解决方案5】:

      以上所有答案都是正确的,我更喜欢使用 tui 模式(ctrl+X A 或 'tui enable'),它在单独的窗口中显示您的位置和功能,这对用户非常有帮助。 希望这也有帮助。

      【讨论】:

      • 哇,谢谢!我不知道这个功能,我认为这个答案必须得到更多的支持!
      猜你喜欢
      • 1970-01-01
      • 2013-05-15
      • 2017-04-27
      • 1970-01-01
      • 2012-09-15
      • 2021-10-24
      • 1970-01-01
      • 2012-01-05
      相关资源
      最近更新 更多