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

Bor*_*kov 84 debugging gcc gdb

list 命令打印一组行,但我需要一行,我在哪里,可能发生错误.

use*_*307 94

'frame'命令将为您提供所需的内容.(这可以缩写为'f').这是一个例子:

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

没有参数,'frame'只是告诉你你在哪里(用一个参数来改变框架).有关frame命令的更多信息,请参见此处.


kum*_*ran 19

我在调试时得到了相同的信息.虽然不是在我检查堆栈跟踪时.很可能你会使用我认为的优化标志.检查此链接 - 相关的内容.

尝试编译并-g3删除任何优化标志.然后它可能会工作.HTH!


alb*_*fan 18

请记住,gdb是一个功能强大的命令 - 能够执行低级指令 - 因此与程序集概念相关联.

你要找的是de指令指针,即:

指令指针寄存器指向处理器下次尝试执行的存储器地址.指令指针被称为IP在16位模式下,EIP在32位模式,和撕裂在64位模式.

这里有更多细节

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

(gdb) info registers
Run Code Online (Sandbox Code Playgroud)

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

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

(gdb)info line *$rip
Run Code Online (Sandbox Code Playgroud)

将显示行号和文件来源

(gdb) list *$rip
Run Code Online (Sandbox Code Playgroud)

会告诉你之前和之后的几行

但可能

(gdb) frame
Run Code Online (Sandbox Code Playgroud)

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

  • 我相信GDB不支持16位模式,因此在这里从不使用`ip`。另外,除了显式拼写程序计数器的名称外,您还可以使用GDB的别名:$ pc。因此`x / 10i $ pc`将在当前指令指针处反汇编10条指令,而无论其体系结构如何-它将在i386,x86_64,ARM等上运行。 (2认同)

pra*_* pp 14

命令可以使用whereframe.其中command将提供有关函数名称的更多信息


Maz*_*MIK 5

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