调试复杂 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 的值,但这绝不是通用的。
我将 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 的值,但这绝不是通用的。