调试复杂返回语句

Debug complex return statement

本文关键字:语句 返回 复杂 调试      更新时间:2023-10-16

我正在使用TotalView作为Linux C 调试器。我们代码中的功能通常看起来像这样

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

在完成某些初步工作的地方,而不是一个或多或少复杂的功能bar称为返回语句。

这很难通过TotalView进行调试,因为不容易观察到有趣的返回值。TotalView无法评估表达的bar(a,b)。我可以将代码重写为

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

现在,我可以在返回值上放置一个断点,并观察我功能bar的内和输出。

如果不引入新的(无用)变量?

我该怎么做

让编译器通过称为命名的返回值优化的过程优化"无用"变量,然后将其放入。(尽管我个人会帮助您通过明确使用函数的返回类型而不是auto;因此,在return阶段没有潜在的类型转换。)。对于它的价值,即使使用诸如std::vector之类的重物,我都会一直这样做。如果您怀疑编译器正在制作多余的副本,则可以随时检查生成的汇编程序。

然后,您可以如您所知,在适当的位置设置一个断点。

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

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