如何获取当前方法调用跟踪?包括文件路径和代码行号

时间:2018-05-21 06:13:40

标签: c# debugging stack-trace

如果我使用此代码:

static void Main()
{
    A();
}
static void A()
{
    B();
}
static void B()
{
    C();
}
static void C()
{
    System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
    Console.WriteLine(t);
}

我可以得到这个:

at test.MyClass.C()
at test.MyClass.B()
at test.MyClass.A()
at test.MyClass.Main()

但如果我想要更多这样的信息,我该怎么办?    在

test.MyClass.C()  at Program.cs line 26
at test.MyClass.B()  at Program.cs line 22
at test.MyClass.A()  at Program.cs line 18
at test.MyClass.Main()  at Program.cs line 12

看起来我的帖子主要是代码;所以我需要在这里输入更多的单词...

2 个答案:

答案 0 :(得分:2)

是。您可以通过使用来电信息属性,获取有关方法调用方的信息以及所有相关的调试信息msdn link https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/caller-information

public void TraceMessage(string message,  
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",  
        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",  
        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)  
{  
    System.Diagnostics.Trace.WriteLine("message: " + message);  
    System.Diagnostics.Trace.WriteLine("member name: " + memberName);  
    System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);  
    System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);  
}  

否则,如果您可以使用外部库来跟踪和记录每个信息,那么您可以使用http://logging.apache.org/log4net/,the文档也足够了。

答案 1 :(得分:1)

您可以使用一些特殊的(并且不是众所周知的)来电者信息属性参数,例如我有一个围绕我的Log4Net实现的包装来获取源行号:

//I enhance the Log4Net logging by capturing the caller's name and the line of code number
public static void Error(Type source, object message, Exception e = null, [CallerMemberName] string memberName = "",
 [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
{
    ILog logger = getLogger(source);
    if (!logger.IsErrorEnabled) return;

    if (e == null)
        logger.Error(string.Format("MemberName: {0}, SourceLineNumber of {1}, Message: {2}", memberName, sourceLineNumber, message));
    else
        logger.Error(string.Format("MemberName: {0}, SourceLineNumber of {1}, Message: {2}", memberName, sourceLineNumber, message), e);

}

可选参数上的这些属性允许我们获取成员名称,文件路径和源行号:

[CallerMemberName] string memberName = "",  
[CallerFilePath] string sourceFilePath = "",  
[CallerLineNumber] int sourceLineNumber = 0

日志文件输出:

  

ERROR XYZ.Tools.Emailing.Email - MemberName:SendEmail,   SourceLineNumber为129,消息:通过Exchange发送电子邮件失败   服务器