调用栈信息

3
在Visual Studio 2012中,我使用调试启动应用程序。我打开了一些屏幕,然后关闭它。此时,当我查看调用堆栈时,可以看到我的应用程序的起始点,一些打开/关闭屏幕的方法,以及许多(外部)调用不来自我的应用程序。我注意到很多在我的应用程序中执行的调用没有列出来。
我在我的应用程序中放置了一个断点。当应用程序命中断点时,我使用F11逐步进入代码。基本上它所做的就是从循环中调用SomeMethod(断点设置在循环中)。
当我使用F11进入SomeMethod时,我看到SomeMethod在调用堆栈中被列出,但如果我按F5,再次命中断点(在循环中),并再次查看调用堆栈,则不再列出SomeMethod。
那么,调用堆栈如何决定显示哪些方法?我们如何获得已执行的全部方法列表?
5个回答

3
调用栈并不是已经被调用的方法的列表,它是已经被调用但没有返回的方法的列表。
让我解释一下。
首先,我会举一个简单的例子来说明一个函数调用。运行程序时会调用一个函数。为了这样做,它会把参数和自身的位置推到栈上(现在位于栈顶)。然后,它调用该函数,该函数跳转指令指针到该函数代码所在的位置。该函数从堆栈中拉出它的参数(刚刚被调用,所以知道它们必须在堆栈的顶部),并运行其本地代码。完成后,它从堆栈中取出返回地址,并使用它将指令指针返回到调用该函数的位置。
现在考虑更复杂的情况,任何函数都可以调用任何其他函数 - 它将完全相同,但现在堆栈将包含最近调用的函数底部的第一个调用的函数。因为你总是从栈顶取,所以你总是返回到最后一次调用的位置。
好的,当在调试器中查看调用栈时,您将看到程序中当前位置之前所有已经调用的函数。在某些时候,代码将返回到栈中列出的这些位置。但是,如果函数调用已经返回,它将不再在栈上,当该函数返回时,该函数已从栈中弹出。

2
调用堆栈只显示特定线程中当前处于“进行中”状态的方法(它们尚未退出)。堆栈不包括已完成的方法。
查找运行或未运行的方法最简单的方法是使用分析器。在Visual Studio中,它被称为“性能分析”(在“分析”菜单下)。
如果您是新手,请使用“性能向导”(也在“分析”菜单中)。选择“插装”作为分析方法,因为这将给出函数调用计数(采样可能会错过没有花费太多时间的方法调用)。
还应提到的是,分析器不会给出方法调用的顺序。它只会对它们进行计数。如果您需要知道方法调用的顺序,您需要手动跟踪(通过添加代码到每个方法的开头和/或结尾来记录调用)。

2

调用栈不会显示先前执行过的方法,而是显示正在执行的方法调用树/堆栈/层次结构。第一个方法是您当前所在的方法 - 通常是您使用调试器设置断点或步入的地方。

您可以使用“跳出”命令来查看这一点 - 这将使您直接跳转到调用栈中的下一个方法。


0

我认为你对调用栈的实际含义有误解。每当一个方法调用另一个方法时,它在旧方法中的地址就会被推入堆栈。一旦它返回到该方法,它就会从堆栈中弹出并不再显示。

它不是所有已调用方法的记录,而是执行当前执行块完成后将返回到哪里的列表。


0
调用栈是一种堆栈数据结构,用于存储有关活动子程序的信息。当方法完成时,它不再被视为活动状态,因此不会显示在调用栈上。基本上,你可以看到的调用栈是到达断点所在位置的当前方法调用路径。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接