调试复杂 return 语句

Debug complex return statement

我将 totalview 用作 linux C++ 调试器。我们代码中的函数通常看起来像这样

double foo() {
    int a = 2;
    int b = 3;
    return bar(a,b);
}

完成一些初步工作,或多或少复杂的函数 bar 称为 return 语句。

这很难用 totalview 调试,因为有趣的 return 值不容易观察到。 Totalview 无法计算表达式 bar(a,b)。我可以将代码重写为

double foo() {
    int a = 2;
    int b = 3;
    const auto retVal = bar(a,b);
    return retVal;
}

现在,我可以在 return 值处放置一个断点并观察函数 bar 的输入和输出。

如何在不引入新的(无用的)变量的情况下做到这一点?

让编译器优化掉 "useless" 变量,通过一个名为 名为 return 值优化 的过程,并将其保留在里面。(虽然我个人认为将通过显式使用函数的 return 类型而不是 auto 来尽可能地帮助编译器;因此在 return 阶段没有潜在的类型转换。)对于它的价值,我一直这样做,即使是 std::vector 这样的重物。如果您怀疑编译器正在制作多余的副本,您可以随时检查生成的汇编程序。

然后你就可以在你知道的合适的地方设置断点了

在某些调试器中,您可以通过查看寄存器直接检查函数 return 的值,但这绝不是通用的。

参考:http://en.cppreference.com/w/cpp/language/copy_elision