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


Answers:


21

我在调试时确实获得了相同的信息。虽然不是在检查stacktrace时。我认为您很可能会使用优化标志。检查此链接 -相关内容。

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


1
嗯,所以尽管我的程序被编译-g为包含调试信息,但我目前处于一个堆栈框架中,该框架取自共享库之一,显然该库未编译为包含行信息。谢谢,库玛
鲍里斯·伯科夫

104

'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命令的更多信息,请参见此处


21

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

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

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

这里更多细节

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

(gdb) info registers

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

然后(这里用最普通的寄存器RIP如今,随着更换EIP或很少的ip如果需要的话):

(gdb)info line *$rip

将显示行号和文件来源

(gdb) list *$rip

会向您显示该行之前和之后的一些

但可能

(gdb) frame

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


2
我相信GDB不支持16位模式,因此ip这里从未使用过。另外,您可以使用GDB的别名代替:显式拼写程序计数器的名称$pc。所以,x/10i $pc将在反汇编当前指令指针10个指令,不管架构-它会在i386,x86_64的工作,ARM等
鲁斯兰

18

命令在那里都可以使用。其中命令将使用函数名称提供更多信息


2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.