list
命令打印一组行,但我需要一行,我在哪里,可能发生错误。
答案 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),该模式在单独的窗口中显示您的位置和功能,这对用户非常有帮助。 希望对您有帮助。