执行函数的最后一行后,这在 gdb 中意味着什么?
What does this mean in gdb after executing the last line of a function?
第 31 行是此 C++ 函数的最后一行。越过它之后,这个奇怪的数字 0x00007ffe1fc6b36b
被打印出来,它开始往回走函数,回到第 30 行。我想它现在正在调用析构函数。我只是好奇那个奇怪的数字是什么意思
31 _sock->bind(addr);
(gdb) n
0x00007ffe1fc6b36b 30 _sock = unique_ptr<zmq::socket_t>(new zmq::socket_t(_ctx,zmq::socket_type::req));
如果实际的$pc
值与一行的开头不匹配(根据调试信息中的行table),那么GDB将在打印前打印$pc
行号和源代码行。
这就是这里发生的事情。对于第 31 行,GDB 停在第 31 行开头的确切地址,因此没有打印地址。
对于第 30 行的输出,正如您所说,几乎可以肯定是析构函数调用,我们现在位于 0x00007ffe1fc6b36b
的地址与第 30 行相关联,但不是该行的开头,因此,GDB 打印地址。
这里要理解的重要一点是,当 GDB 打印出如下内容时:
31 _sock->bind(addr);
该行的任何部分尚未执行,而当 GDB 打印时:
0x00007ffe1fc6b36b 30 _sock = unique_ptr<zmq::socket_t>(new zmq::socket_t(_ctx,zmq::socket_type::req));
然后该行正在执行的一半,因此您的程序将处于某种奇怪的半途状态;在这种情况下,对象已被构造,但尚未被破坏。
第 31 行是此 C++ 函数的最后一行。越过它之后,这个奇怪的数字 0x00007ffe1fc6b36b
被打印出来,它开始往回走函数,回到第 30 行。我想它现在正在调用析构函数。我只是好奇那个奇怪的数字是什么意思
31 _sock->bind(addr);
(gdb) n
0x00007ffe1fc6b36b 30 _sock = unique_ptr<zmq::socket_t>(new zmq::socket_t(_ctx,zmq::socket_type::req));
如果实际的$pc
值与一行的开头不匹配(根据调试信息中的行table),那么GDB将在打印前打印$pc
行号和源代码行。
这就是这里发生的事情。对于第 31 行,GDB 停在第 31 行开头的确切地址,因此没有打印地址。
对于第 30 行的输出,正如您所说,几乎可以肯定是析构函数调用,我们现在位于 0x00007ffe1fc6b36b
的地址与第 30 行相关联,但不是该行的开头,因此,GDB 打印地址。
这里要理解的重要一点是,当 GDB 打印出如下内容时:
31 _sock->bind(addr);
该行的任何部分尚未执行,而当 GDB 打印时:
0x00007ffe1fc6b36b 30 _sock = unique_ptr<zmq::socket_t>(new zmq::socket_t(_ctx,zmq::socket_type::req));
然后该行正在执行的一半,因此您的程序将处于某种奇怪的半途状态;在这种情况下,对象已被构造,但尚未被破坏。