我試圖更深入地了解作業系統如何堆疊鍊式函數呼叫。所以我創建了一個非常簡單的 dotnet 控制台應用程序,請參閱下面的程式碼,我從 Main 方法調用“Call()”方法。運行 exe 並在進程資源管理器中搜尋堆疊。
但我無法理解它。我期待看到函數執行的堆疊。有沒有更好的方法可以在進程資源管理器或其他 sysinternals 工具中尋找此資訊?
public class StudyingStackExecution_B
{
public void Call()
{
Console.ReadKey();
MethodA();
}
private void MethodA()
{
var varA_1 = new object();
var varA_2 = new object();
var varA_3 = new object();
Console.WriteLine("A");
Console.ReadKey();
MethodB();
}
private void MethodB()
{
var varB_1 = new object();
var varB_2 = new object();
var varB_3 = new object();
Console.WriteLine("B");
Console.ReadKey();
MethodC();
}
private void MethodC()
{
var varC_1 = new object();
var varC_2 = new object();
var varC_3 = new object();
Console.WriteLine("C");
Console.ReadKey();
MethodD();;
}
private void MethodD()
{
var varD_1 = new object();
var varD_2 = new object();
var varD_3 = new object();
Console.WriteLine("D");
Console.ReadKey();
}
}
答案1
這是因為您建立了一個 .NET 應用程式(託管程式碼),而 Process Monitor 不會向您顯示託管程式碼(僅限本機程式碼,例如 C++)的堆疊。
看看這裡:https://stackoverflow.com/a/22436707/2879900
您可以在偵錯時使用 Visual Studio 中的「呼叫堆疊」視窗來顯示目前的呼叫堆疊:
https://docs.microsoft.com/en-us/visualstudio/debugger/how-to-use-the-call-stack-window?view=vs-2022
在「偵錯」功能表中,選擇「視窗」>「呼叫堆疊」。