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

Debugging gdb:如何打印当前行或查找当前行号?,debugging,gcc,gdb,Debugging,Gcc,Gdb,list命令打印一组行,但我需要一行,即我所在的位置和可能发生错误的位置。我在调试时确实得到了相同的信息。虽然不是在我检查stacktrace的时候。我想你很可能会使用优化标志。检查这个-相关的东西 尝试使用-g3进行编译,删除任何优化标志。 那么它可能会起作用。 嗯 使用“frame”命令将显示您要查找的内容。(可以缩写为“f”)。以下是一个例子: (gdb) frame \#0 zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0)

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

我在调试时确实得到了相同的信息。虽然不是在我检查stacktrace的时候。我想你很可能会使用优化标志。检查这个-相关的东西

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

使用“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命令的更多信息,请参见。

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

您要查找的是de指令指针,即:

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

更多细节

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

(gdb) info registers
使用它,您可以找到程序正在运行的模式(查看这些寄存器中存在的寄存器)

然后(这里使用当前最常见的寄存器rip,如果需要,替换为eip或极少数ip):

将显示行号和文件源

(gdb) list *$rip
我会给你看几行前后的

但可能

(gdb) frame

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

命令,其中可以使用。如果command将提供函数名的更多信息,则上述所有答案都是正确的,我更喜欢使用tui模式(ctrl+X A或“tui enable”),该模式在单独的窗口中显示您的位置和函数,这对用户非常有帮助。
希望这也能有所帮助。

backtrace
where
,甚至
info-line
,或者干脆
bt
(用于回溯)。对于gdb教程
bt
backtrace
where
打印函数调用堆栈,
f
frame
打印要执行的下一行。啊,虽然我的程序是用
-g
编译的,以包含调试信息,但我目前处于堆栈框架中,取自一个共享库,这显然不是为了包含行信息而编译的。谢谢,库马尔。年度评论奖。非常感谢你!我相信GDB不支持16位模式,所以这里从不使用ip。另外,您可以使用GDB的别名:
$pc
,而不是显式拼写程序计数器的名称。因此,
x/10i$pc
将在当前指令指针处反汇编10条指令,而不考虑体系结构-它将在i386、x86_64、ARM等上工作。。
(gdb) frame