簡體   English   中英

Visual Studio 方法調用流轉儲

[英]Visual Studio Method Call Flow Dump

我想在我的 .net 項目中從上到下列出方法調用順序。

    using System;
                        
    public class Program
    {
    public static void Main()
    {
        One();
    }
    
    public static void One(){
        Two();
    }
    
    public static void Two(){
        Three();
    }
    
    public static void Three(){
        Four();
    }
    
    public static void Four(){
        Console.WriteLine("Hello World!");
    }
}

在上面的示例 class 中,我需要獲取類似“Main()->One()->Two()->Three()->Four()”的日志

您可以使用System.Diagnostics.StackTrace獲取當前 stackTrace 並使用它來記錄所需的:

根據您的代碼演示:

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        One();
    }
    
    public static void One(){
        Two();
    }
    
    public static void Two(){
        Three();
    }
    
    public static void Three(){
        Four();
    }
    
    public static void Four(){
        Console.WriteLine("Hello World!");
        var stackTrace = new System.Diagnostics.StackTrace();
        List<string> methods = new List<string>();
        for (int i = stackTrace.FrameCount - 1; i >= 0; i--)
        {
            methods.Add($"{stackTrace.GetFrame(i).GetMethod().Name}()");
        }
        
        Console.WriteLine(string.Join("->", methods));
    }
}

上面的代碼將 output 打印為

Main()->One()->Two()->Three()->Four()

檢查小提琴 - https://dotnetfiddle.net/Ee8ni8

有一個非理想的解決方案:

  • 准備一組測試用例,以盡可能多的組合運行您的程序方法,從而提供良好的代碼覆蓋率。
  • 在每個方法主體的開頭手動添加堆棧跟蹤日志記錄功能,並根據您的需要調整堆棧跟蹤日志記錄格式( Main()->One()... )。 正如 user1672994 所指出的,這可以通過System.Diagnostics.StackTrace來完成。
  • 過濾您的堆棧跟蹤日志,使其僅包含不是任何其他堆棧跟蹤前綴的堆棧跟蹤,從而留下不完整的路徑。

您還可以從 Visual Studio 中的Call Hiarchy window中發現調用流程,但它不會以請求的格式為您提供數據。 但是,它會獨立於您可能不完美的測試用例找到呼叫流程。

另請參閱: Visual Studio 調用層次結構視圖:以編程方式調用它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM