c++ - 为什么 gdb 显示两种不同的返回?

标签 c++ gdb

上周我在调试代码时遇到了一个奇怪的情况:gdb 通过了两个不同的 return 子句。我做了一个简单的例子来说明情况:

#include <iostream>

using namespace std;

int test() {

    string a = "asd";
    string b = "asd";

    while (true) {
        if (a == b) {
            return 0;
        }
    }
    return -1;
}

int main() {
    int result = test();
    cout << "result: " << result << endl;
}

在调试我得到的代码时:

(gdb) b main
Breakpoint 1 at 0x1d4c: file example.cpp, line 19.
(gdb) r
Starting program: /Users/yuppienet/temp/a.out 
Reading symbols for shared libraries +++. done

Breakpoint 1, main () at example.cpp:19
19          int result = test();
(gdb) s
test () at example.cpp:7
7           string a = "asd";
(gdb) n
8           string b = "asd";
(gdb) n
11              if (a == b) {
(gdb) n
12                  return 0;
(gdb) n
15          return -1;
(gdb) n
16      }
(gdb) n
main () at example.cpp:20
20          cout << "result: " << result << endl;
(gdb) n
result: 0
21      }
(gdb) n
0x00001ab2 in start ()

我注意到即使 gdb 显示第 15 行,返回值为 0(finish 命令也证实了这一点)。

所以问题是:为什么 gdb 显示第 15 行:return -1,即使该函数并没有真正返回这个值?

谢谢!

编辑: 我忘了说我是用以下行编译的:

g++ -Wall -pedantic -g -pg example.cpp

最佳答案

我怀疑您看到的是函数结尾。你的两个字符串有析构函数,它们在返回时被隐式调用。查看反汇编的内容以确保确定,但我怀疑这两个 return 语句都映射到以下内容:

stash return_value;
goto epilogue;

相应地:

epilogue: 
  destroy a; // on the stack, so destructor will be called
  destroy b;
  really_return(stashed value);

结语似乎来自第 15 行,作为 g++ 如何进行行编号的副作用——一种相当简单的格式,实际上只是“地址 X 来自行号 Y”形式的标签列表——所以它是将 15 报告为最接近的匹配项。在这种情况下令人困惑,但很多时候都是正确的。

关于c++ - 为什么 gdb 显示两种不同的返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2802393/

相关文章:

c++ - 列表与引用一起使用,作为成员使用时会更改行为

Emacs + GDB + SCons + 单步调试

linux - Mono AOT 编译程序的事后调试

C++ FTP 写入文件不起作用

c++ - 在 GitHub 中,如何在 "RecoverCompact"中搜索 "CPubKey::RecoverCompact"

c++ - 子弹头车轮落后和错误的底盘俯仰方向

c - GDB 无法在共享库上设置断点

linux - gdb 错误 - 文件不是可执行格式 : File format not recognized

c++ - GDB 以无序的方式跳到错误的行

c++ - stringstream 添加一个额外的零