可以在调用方法内部获得方法调用的堆栈跟踪

本文关键字:调用 方法 堆栈 跟踪 内部 | 更新日期: 2023-09-27 18:19:06

我想在调用方法级别向日志记录器添加更多信息,并且我需要知道是否存在获得StackTrace方法调用内部调用的可能性。

UPDATE:这样做的目的是绘制所有被调用方法的流程,直到调用方法内部的某个步骤。

例子:

public class Type1
{
    internal string method2_T1() {
        return new Type2().method1_T2();
    }        
}

public class Type2
{
    public string method1_T2()
    {
        return "Type2.method1_T2";
    }       
}

static void Main(string[] args)
{            
     string t = new Type1().method2_T1();
      LogNow();
        ....
}

和当我调用LogNow()时获得的结果是:

StackTrace of method2_T1()

谢谢

可以在调用方法内部获得方法调用的堆栈跟踪

这很简单:

var stackTrace = new StackTrace(true);
var traceToLog = stackTrace.ToString();

true参数表示包含文件信息

Todd Sprang的答案与实际答案一样好,但是要注意,当您移动到RELEASE构建或使用async/await时,堆栈跟踪将以不可预测的方式变化。不要在编程上依赖于答案,因为当您将代码投入生产时,您可能会陷入困境。

如果您想知道一个特定函数的直接调用者,以Microsoft推荐的方式,使用[CallerMemberName][CallerFilePath][CallerLineNumber]属性有一个有用的技巧。像这样标记可选参数;

public void LogWithCallerInfo(
    string message,
    [CallerMemberName] string memberName = "Caller",
    [CallerFilePath] string sourceFilePath = "File",
    [CallerLineNumber] int sourceLineNumber = 0)
    {
        WriteProgressMessage(..., memberName, sourceFilePath, sourceLineNumber);
    }
LogWithCallerInfo("my message");

三个可选参数将被替换为相应的调用信息