在Visual Studio 2012中,我使用调试启动应用程序.我打开一些屏幕,然后关闭它.此时,当我查看Call Stack时,我可以看到我的应用程序中的起点,一些打开/关闭屏幕的方法,以及许多(外部)调用不是来自我的应用程序.我注意到我的应用程序中的许多调用都没有列出,尽管它们已被执行.
我在我的应用程序中放置了一个断点.当应用程序到达断点时,我开始使用F11进入代码.基本上它的作用是,它从循环中调用SomeMethod(断点在循环中设置).
当我使用F11进入SomeMethod时,我看到SomeMethod列在调用堆栈中,但如果我点击F5,然后再次点击一个断点(在一个循环中),再看一下调用堆栈,SomeMethod没有列出任何更多.
解决方法
调用堆栈不是已调用的方法列表,它是已调用但未返回的方法列表.
让我解释
我将首先给出一个函数调用的简单示例.运行程序时会调用该函数.为此,它将参数和自身的位置推送到堆栈上. (现在位于堆栈的顶部).然后它调用函数,该函数将指令指针跳转到该函数的代码所在的位置.该函数将其参数从堆栈中拉出(它被调用,因此它知道它们必须位于堆栈的顶部)并运行它的本地代码.完成后,它会从堆栈中拉出返回地址,并使用它将指令指针返回到调用此函数的位置.
现在在更复杂的情况下,任何函数都可以调用任何其他函数 – 它将完全相同但现在堆栈将包含在最近调用的函数底部调用的第一个函数.因为您总是从堆栈的顶部开始,所以您将始终返回到最后一次调用的位置.
好的,所以当在调试器中查看调用堆栈时,您将看到在您在程序中的位置之前进行的所有函数调用.在某些时候,代码将返回到堆栈中列出的位置.但是,如果已经从它返回的函数调用将不再在堆栈上,则在该函数返回时它已从堆栈中弹出.