可以在调用方法中获取方法调用的堆栈跟踪吗?

时间:2015-10-25 20:04:49

标签: c# stack-trace

我想在调用方法级别向记录器添加更多信息,我需要知道是否有可能在调用方法中调用 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()时,获得的结果是:

方法2_T1()

StackTrace

...

由于

3 个答案:

答案 0 :(得分:0)

这很简单:

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

true参数表示包含文件信息。

答案 1 :(得分:0)

Todd Sprang的回答很好,但请注意,当您转移到RELEASE版本或使用async / await时,堆栈跟踪将以不可预测的方式发生变化。不要以编程方式依赖答案,因为当您将代码投入生产时,您可能会失败。

答案 2 :(得分:0)

如果您想以微软推荐的方式了解特定功能的直接来电者,那么使用[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");

三个可选参数将替换为相应的呼叫信息。