VC调试篇:ASSERT(FALSE)时怎么办?查看调用堆栈

问题简述

我们在调试程序时,经常会遇到程序中断的情况,就像下图这样。

程序调试中断

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

发生中断的地方

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

调试方法

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

C++函数调用堆栈

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

VS2010查看调用堆栈

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

  1. 按键盘的 Alt + 7 ,程序会显示调用堆栈。如下图

调用堆栈

  1. 或者直接点击下面的 调用堆栈 也可以显示该窗口,没有的话可以在菜单中找到 调试 -> 窗口 -> 调用堆栈 就可以显示调用堆栈窗口了。

双击调用堆栈的某一行,可以定位到此次调用的源代码或汇编指令处。

总结

  1. VC调试中断时可以查看调用堆栈定位中断位置。
  2. 按 Alt + 7 可以查看调用堆栈

参考

  1. http://bbs.csdn.net/topics/390096855
原文地址:https://www.cnblogs.com/smallpi/p/7190488.html