【发布时间】:2013-11-15 17:37:23
【问题描述】:
我有一个名为 size_t A::m() const 的非静态 const 方法,如果它返回大于 1 的值,我想用它来触发断点。这里是 class A 和实例 a:
class A
{
public:
std::vector<double> myvec;
size_t m() const
{
return myvec.size();
}
} a;
所以我在 Visual Studio 2013 中添加了一个带有这种条件的断点
a.m() > 1 // a is an instance of class A
但是,当我尝试编译它时,我从 IDE 收到以下消息:
无法设置以下断点:
在 myFile.cpp,第 xxx 行,当 'a.m() > 1' 为真时
这个表达式有副作用,不会被计算。
请注意,A::m() 不会修改任何内容,它仅调用向量的 .size() 方法并返回该值,因此表达式具有副作用的断言完全是错误的。其实替换断点条件为a.myvec.size() > 1(即方法本身的内容)效果是一样的!
关于断点中什么可以用作条件,Microsoft says that;
条件可以是任何被 调试器。
所以我去看看Expressions in the Debugger和found this:
副作用的一个常见原因是在 调试器窗口。这样的评价通常是引人注目的。一个更 副作用的微妙原因是对属性和其他的评估 托管代码中的隐式函数调用。
调试器无法判断属性评估还是隐式 函数调用有副作用。因此,默认情况下,调试器 不会自动评估隐式函数调用。财产 默认情况下允许评估,但可以在选项中关闭 对话框。当尚未评估函数调用或属性时, 出现刷新图标。您可以通过手动评估表达式 单击刷新图标。有关详细信息,请参阅如何:刷新手表 价值观。
当评估属性或隐式函数调用时 关闭,您可以使用 ac 格式修饰符强制评估(对于 C# 只要)。见Format Specifiers in C#.
如果有人可以将以上段落翻译成英文,那就太好了。我可以将函数放入这些调试器条件中吗?
【问题讨论】:
-
a的类型是什么? -
@dauphic 我已经添加了整个类和实例的定义
-
a不是指针,也不会重载运算符->。 -
@dauphic 我修好了;虽然这只是一个例子,但这并不相关。
-
我也遇到了同样的问题。一种解决方法是自己编写一个
if,并在if中设置断点。
标签: c++ debugging visual-studio-2013