【问题标题】:Visual Studio Method Call Flow DumpVisual Studio 方法调用流转储
【发布时间】:2021-04-22 11:04:25
【问题描述】:

我想在我的.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!");
    }
}

在上面的示例类中,我需要像这样获取日志 “主()->一()->二()->三()->四()”

【问题讨论】:

  • 您可以使用System.Diagnostics.StackTrace 获取当前的stackTrace,您可以进行相应的打印。

标签: c# .net asp.net-mvc wcf model-view-controller


【解决方案1】:

您可以使用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));
    }
}

上面的代码将输出打印为

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

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

【讨论】:

  • 感谢您的快速响应,在这种方法中,我们可能必须在最后一个方法结束时记录堆栈跟踪。在我的场景中,我有超过 250 个 wcf 方法。
  • 你不应该在你的每一种方法中都这样做。这应该与您的日志记录功能一起作为横切关注点。因此,代码中任何位置的任何 Log 语句都将输出带有堆栈跟踪的日志以及消息。如果您只想为特定的类/命名空间/程序集启用它,那么可以通过一些配置来控制它(您需要编写它)。
【解决方案2】:

有一个不理想的解决方案:

  • 准备一组测试用例,以尽可能多的组合运行您的程序方法,从而提供良好的代码覆盖率。
  • 在每个方法主体的开头手动添加堆栈跟踪记录功能,并根据需要调整堆栈跟踪记录格式 (Main()-&gt;One()...)。这可以使用System.Diagnostics.StackTrace 来完成,用户1672994 pointed out
  • 过滤您的堆栈跟踪日志,使其仅包含不是任何其他堆栈跟踪前缀的堆栈跟踪,从而保留不完整的路径。

您还可以在 Visual Studio 中发现来自 Call Hiearchy window 的调用流,但它不会以请求的格式为您提供数据。但是,它会独立于您可能不完善的测试用例来查找调用流程。

另见:Visual Studio Call Hierarchy View: call it programmatically

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    相关资源
    最近更新 更多