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

esbemjvw  于 2023-06-23  发布在  其他
关注(0)|答案(5)|浏览(173)

list命令打印一组行,但我需要一行:我目前所在的位置以及可能发生错误的位置。

wqsoz72f

wqsoz72f1#

“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命令的更多信息,请参阅here

9vw9lbht

9vw9lbht2#

命令其中frame可以使用。其中命令将给予函数名称的更多信息

mgdq6dx1

mgdq6dx13#

我在调试时确实得到了同样的信息。不过,我检查堆栈跟踪的时候不行。我想你很可能会使用优化标志。看看这个link-相关的东西。
尝试使用-g3编译删除任何优化标志。那就可能成功了HTH!

wr98u20j

wr98u20j4#

请记住,gdb是一个功能强大的命令-能够执行低级指令-因此与汇编概念相关联。
你要找的东西叫做de指令指针,即:
指令指针寄存器指向处理器接下来将尝试执行的存储器地址。指令指针在16位模式下称为ip,在32位模式下称为eip,在64位模式下称为rip
更多详情here
gdb执行中可用的所有寄存器可以用以下方式显示:

(gdb) info registers

有了它,你可以找到你的程序运行的模式(看看这些寄存器中存在哪些)
然后(这里使用现在最常见的寄存器rip,如果需要,用eip或很少用ip替换):

(gdb)info line *$rip

将显示行号和文件源

(gdb) list *$rip

我会给你们看这条线的前后部分
但很可能

(gdb) frame

在很多情况下就足够了。

guykilcj

guykilcj5#

所有其他答案都是正确的,但我更喜欢使用TUI mode(Ctrl+X+A或tui enable),它在一个单独的窗口中显示您的位置和功能,这对用户非常有帮助。
希望这也有帮助。

相关问题