调试复杂的return语句

时间:2017-12-05 08:03:21

标签: c++ debugging totalview

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

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

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

使用totalview很难调试,因为无法轻易观察到有趣的返回值。 Totalview无法评估表达式bar(a,b)。我可以将代码重写为

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

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

如何在不引入新(无用)变量的情况下执行此操作?

1 个答案:

答案 0 :(得分:0)

让编译器优化"无用的"变量,由一个名为命名的返回值优化的进程,并保留。(就个人而言,尽管我会通过显式使用函数的返回类型而不是{{1}来尽可能地帮助编译器因此auto阶段没有潜在的类型转换。)。对于它的价值,我会一直这样做,即使是return这样的重物。如果您怀疑编译器正在制作多余的副本,则可以随时检查生成的汇编程序。

然后,您可以在适当的位置设置断点。

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

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