gdb:如何打印当前行或查找当前行号?

时间:2013-01-29 11:27:51

标签: debugging gcc gdb

list命令打印一组行,但我需要一行,我在哪里,可能发生错误。

5 个答案:

答案 0 :(得分:85)

'frame'命令将为您提供所需内容。 (这可以缩写为'f')。这是一个例子:

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

没有参数,'frame'只会告诉你你在哪里(用一个参数来改变框架)。有关frame命令的更多信息可以在here找到。

答案 1 :(得分:16)

我在调试时获得了相同的信息。虽然不是在我检查堆栈跟踪时。很可能你会使用我认为的优化标志。检查此link - 相关的内容。

尝试使用-g3进行编译,删除任何优化标记。 然后它可能会工作。 HTH!

答案 2 :(得分:14)

请记住,gdb是一个功能强大的命令 - 能够执行低级指令 - 所以它与程序集概念有关。

您正在寻找的是称为指令指针,即:

  

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

更多细节here

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

(gdb) info registers

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

然后(现在使用最常见的注册 rip ,用 eip 替换,或者很少 ip ,如果需要):

(gdb)info line *$rip

将显示行号和文件来源

(gdb) list *$rip

会在

之前和之后显示该行

但可能

(gdb) frame

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

答案 3 :(得分:11)

可以使用 框架命令。其中command将提供函数名称

的更多信息

答案 4 :(得分:0)

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