Visual Studio 2012 RC可能存在的断点问题?
使用Visual Studio 2012 RC调试一些C++代码时,我注意到一个奇怪的行为,它带有类成员函数的断点和成员变量的值。Visual Studio 2012 RC可能存在的断点问题?
当我在类成员函数上设置中断点时,VS 2012将中断点放在函数大括号中。现在,当鼠标悬停在函数使用的成员变量上时,该值始终为“未初始化”。但是,按下F10跳到下一行(函数中的第一行),现在将成员变量更改为正确的值。
这看起来像一个类的成员变量的值不加载,直到进入成员函数的第一行。但是这非常令人困惑 - 那么打破花括号的意义何在呢? (如在功能设置断点时是默认的。)
打破类的成员函数:(!它真的不是)
成员变量active
据说是true
步入到下一行与F10:
成员变量active
现在说是false
(这是正确的。)
我失去了一些东西在这里还是这是在Visual Studio 2012 RC确实是个bug?
编辑:我找到了我的Visual Studio 2010副本,并尝试了这一点。关于断点的行为是相同的。区别在于IntelliSense如何处理这种情况。在VS 2010中,IntelliSense在打开大括号时不会弹出工具提示,而在VS 2012中始终显示工具提示。我认为VS 2010的行为好得多,以避免混淆。
通过在大括号上设置断点,您可以给调试器在岩石和硬地之间做出选择。一个艰难的地方是编码风格的惯例,你喜欢K & R bracing吗?
void foo() {
// etc..
}
你如何设置一个断点?调试器在安全方面犯了错误,它在函数入口点上设置了一个断点。当你的断点命中时,你可以使用Debug + Windows + Assembly,你会发现它在函数中第一个机器代码指令上设置了断点。几乎总是push ebp
。这实际上与调试器试图处理不明确的断点的正常方式有点不同,它通常向前看,而不是向后看。所以这是非常有意的。在托管代码的调试器中解决的问题不仅仅是基于行,而且还关注该列。这没有回流到C++调试器,它仍然是基于行的。
因此,检查局部变量不会工作得很好,没有任何。直到执行设置堆栈帧的函数序言。包括这个。
调试器向后看而不是像往常一样转发的可能原因是,您希望单步执行本地变量的类对象的构造函数。同样,除了自己倒回堆栈并在构造函数上设置断点之外,您不能设置明确的断点。谁知道在哪里。
功能,而不是一个错误。显而易见的解决方法是在函数体中的第一条语句上设置一个断点。一切都是由设置,堆栈框架以及本地变量。
我同意这是一个功能,而不是一个错误。不过,我仍然认为这是IntelliSense的一个问题。它应该至少在视觉上表明它不能确定变量的价值。 – 2012-08-05 22:06:19
智能感知与调试器无关。你必须至少通过4到5级管理才能找到微软的共同老板。调试器工作得很好的原因之一。 – 2012-08-05 22:13:54
有趣。为了记录,我更新了我的问题,以突出显示IntelliSense与VS 2010和VS 2012的不同行为。正如我的问题涉及断点和调试器,我将接受这是最好的答案。 – 2012-08-05 22:22:52
默认情况下在x86,C++成员函数使用thiscall调用约定(*),其通过经由ecx
寄存器this
指针。尽管如此,该函数可能会使用该寄存器进行计算,因此调试器在执行函数的整个过程中不能依赖其值为指针this
。
因此,在未经优化的版本中,作为在函数体输入前执行的函数序言的一部分,指针将被“溢出”到堆栈:它被复制到堆栈上的已知偏移量这样调试器就可以可靠地获得它的价值。当您观看this
或成员变量(通过this
指针隐式访问)时,调试器会使用this
指针的此副本。
当您在{
的开始大括号处放置断点时,断点将放置在函数序言的初始地址处,即在函数调用时将执行的第一条指令处。只有在你跳过这个开始的大括号之后,函数序言才会执行,并且指针会溢出到堆栈。
如果您需要通过函数序言进行调试,这会很有用。如果您逐步完成反汇编(Debug - > Windows - > Disassembly),会发生怎样的变化。
(*)在x64上,只有一个调用约定,它是一个快速调用约定。 this
指针最终将通过rcx
寄存器传递,因为它是该函数的“第一个”参数。
在x86上,并非所有成员函数都使用此调用约定,它只是默认值。像其他函数类型一样,您可以指定该函数的调用约定。例如,对于使用stdcall调用约定的COM组件,这是完成的。
这很有道理。我想这是智能感知的更多问题。 – 2012-08-05 21:14:33
Visual Studio 2010是否展现出相同的调试器行为? – 2012-08-05 20:45:00
@JamesMcNellis我没有Visual Studio 2010.对不起。 – 2012-08-05 20:46:29
我再也没有安装它。我一直认为这是通过设计或是一个怪癖。基本上,当调试器断开'{'时,'this'指针还没有被初始化。 – 2012-08-05 20:47:08