如何解决Visual Studio 方法调用流转储
我想在我的 .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 并使用它来记录所需的内容:
根据您的代码进行演示:
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
,有一种不理想的解决方案:
- 准备一组测试用例,以尽可能多的组合运行您的程序方法,从而提供良好的代码覆盖率。
- 在每个方法主体的开头手动添加堆栈跟踪日志记录功能,并根据您的需要调整堆栈跟踪日志记录格式 (
Main()->One()...
)。这可以通过System.Diagnostics.StackTrace
完成,如 user1672994 pointed out。 - 过滤您的堆栈跟踪日志,使其仅包含不是任何其他堆栈跟踪前缀的堆栈跟踪,从而避免不完整的路径。
您还可以在 Visual Studio 中发现来自 Call Hiearchy window 的调用流,但它不会以请求的格式提供数据。但是,它会独立于您可能不完美的测试用例来查找调用流。
另见:Visual Studio Call Hierarchy View: call it programmatically
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。