115

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

4

5 回答 5

123

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

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

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

于 2014-01-08T23:36:43.517 回答
34

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

于 2015-09-15T12:41:14.163 回答
28

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

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

于 2013-01-30T11:05:22.640 回答
20

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

您要查找的内容称为 de 指令指针,即:

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

更多细节在这里

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

(gdb) info registers

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

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

(gdb)info line *$rip

将向您显示行号和文件源

(gdb) list *$rip

将向您展示该行前后的一些内容

但可能

(gdb) frame

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

于 2014-09-10T17:49:05.440 回答
6

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

于 2019-02-01T07:39:36.110 回答