list
commands 打印一组行,但我需要一行,我所在的位置以及可能发生错误的位置。
5 回答
“框架”命令将为您提供所需的内容。(这可以缩写为“f”)。这是一个例子:
(gdb) frame
\#0 zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139 int rc = fq.recv (msg_);
(gdb)
没有参数,“框架”只会告诉你你在哪里(有一个参数它会改变框架)。有关 frame 命令的更多信息,请参见此处。
命令where或frame可以使用。where 命令将使用函数名称提供更多信息
我在调试时确实得到了相同的信息。虽然不是在我检查堆栈跟踪时。我认为您很可能会使用优化标志。检查这个链接- 相关的东西。
尝试使用-g3
删除任何优化标志进行编译。那么它可能会起作用。!
请记住,gdb 是一个强大的命令——能够执行低级指令——因此与汇编概念相关。
您要查找的内容称为 de 指令指针,即:
指令指针寄存器指向处理器下一次尝试执行的内存地址。指令指针在 16 位模式下称为ip ,在 32 位模式下称为eip ,在 64 位模式下称为rip。
更多细节在这里
gdb 执行时可用的所有寄存器都可以显示为:
(gdb) info registers
有了它,您可以找到您的程序正在运行的模式(查看这些寄存器中的哪些存在)
然后(这里使用现在最常见的寄存器rip ,如果需要,用eip或很少用ip替换):
(gdb)info line *$rip
将向您显示行号和文件源
(gdb) list *$rip
将向您展示该行前后的一些内容
但可能
(gdb) frame
在很多情况下应该足够了。
以上所有答案都是正确的,我更喜欢使用 tui 模式(ctrl+XA 或 'tui enable'),它在单独的窗口中显示您的位置和功能,这对用户非常有帮助。希望这也有帮助。