c# – 调用堆栈信息

在Visual Studio 2012中,我使用调试启动应用程序.我打开一些屏幕,然后关闭它.此时,当我查看Call Stack时,我可以看到我的应用程序中的起点,一些打开/关闭屏幕的方法,以及许多(外部)调用不是来自我的应用程序.我注意到我的应用程序中的许多调用都没有列出,尽管它们已被执行.

我在我的应用程序中放置了一个断点.当应用程序到达断点时,我开始使用F11进入代码.基本上它的作用是,它从循环中调用SomeMethod(断点在循环中设置).

当我使用F11进入SomeMethod时,我看到SomeMethod列在调用堆栈中,但如果我点击F5,然后再次点击一个断点(在一个循环中),再看一下调用堆栈,SomeMethod没有列出任何更多.

那么,Call Stack如何决定在其中显示哪些方法?我们如何才能获得已执行的完整方法列表?

解决方法

调用堆栈不是已调用方法列表,它是已调用但未返回的方法列表.

让我解释

我将首先给出一个函数调用的简单示例.运行程序时会调用函数.为此,它将参数和自身的位置推送到堆栈上. (现在位于堆栈的顶部).然后它调用函数,该函数将指令指针跳转到该函数代码所在的位置.该函数将其参数从堆栈中拉出(它被调用,因此它知道它们必须位于堆栈的顶部)并运行它的本地代码.完成后,它会从堆栈中拉出返回地址,并使用它将指令指针返回到调用函数的位置.

现在在更复杂的情况下,任何函数都可以调用任何其他函数 – 它将完全相同但现在堆栈将包含在最近调用函数底部调用的第一个函数.因为您总是从堆栈的顶部开始,所以您将始终返回到最后一次调用的位置.

好的,所以当在调试器中查看调用堆栈时,您将看到在您在程序中的位置之前进行的所有函数调用.在某些时候,代码将返回到堆栈中列出的位置.但是,如果已经从它返回的函数调用将不再在堆栈上,则在该函数返回时它已从堆栈中弹出.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...