我艹,这该怎么办,我们一下子就懵逼了。我们选择中断,常常会跳到一个莫名其妙的地方去。

正是这个断言 ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL)) 导致中断的发生,ASSERT中的参数只要是false, 就会发生中断。而且中断的地方,基本上都是父类的内部,这就坑爹了,中断把我们带到坑里来了?我们怎么样才能知道, 自己写的代码哪里出现问题呢?

我们知道,C++函数调用是一个压栈和出栈的过程。应用程序维护这一个函数调用堆栈,就像下图这样

通过调用堆栈的栈顶开始,一直向下寻找,就能回溯函数的调用过程。

VS2010查看调用堆栈

VS2010在程序出现上述问题出现的调试中断时,点一下中断,让程序跳到中断处。然后可以

  • 按键盘的 Alt + 7 ,程序会显示调用堆栈。如下图
  • 或者直接点击下面的 调用堆栈 也可以显示该窗口,没有的话可以在菜单中找到 调试 -> 窗口 -> 调用堆栈 就可以显示调用堆栈窗口了。
  • 双击调用堆栈的某一行,可以定位到此次调用的源代码或汇编指令处。

  • VC调试中断时可以查看调用堆栈定位中断位置。
  • 按 Alt + 7 可以查看调用堆栈
  • http://bbs.csdn.net/topics/390096855
  •