如何在.NET中打印当前的堆栈跟踪,没有任何异常?

时间:2009-02-10 09:45:35

标签: c# .net logging stack-trace printstacktrace

我有一个常规的C#代码。 我没有例外 。我想以编程方式记录当前堆栈跟踪以进行调试。例如:

public void executeMethod() 
{
    logStackTrace();
    method();
}

6 个答案:

答案 0 :(得分:350)

查看System.Diagnostics命名空间。那里有很多好吃的东西!

System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();

如果想要了解最新情况,那真是太好了。

我建议您查看可能达到您的目的的日志记录解决方案(例如NLog,log4net或Microsoft模式和实践Enterprise Library)。祝你好运![/ p>

答案 1 :(得分:195)

System.Diagnostics.StackTrace的替代方法是使用System.Environment.StackTrace返回堆栈跟踪的字符串表示。

另一个有用的选项是使用$CALLER$CALLSTACK debugging variables in Visual Studio,因为这可以在不重建应用程序的情况下启用运行时。

答案 2 :(得分:37)

有两种方法可以做到这一点。 System.Diagnostics.StackTrace()将为您提供当前线程的堆栈跟踪。如果您有对Thread实例的引用,则可以通过StackTrace()的重载版本获取堆栈跟踪。

您可能还想查看Stack Overflow问题 How to get non-current thread's stacktrace?

答案 3 :(得分:13)

您也可以在Visual Studio调试器中执行此操作,而无需修改代码。

  1. 创建一个想要查看堆栈跟踪的断点。
  2. 右键单击断点,然后在VS2015中选择“操作...”。在VS2010中,选择“When Hit ...”,然后启用“Print a message”。
  3. 确保选择“继续执行”。
  4. 输入您要打印的文字。
  5. 在想要查看堆栈跟踪的位置添加$ CALLSTACK。
  6. 在调试器中运行程序。
  7. 当然,如果你在不同的机器上运行代码,这没有任何帮助,但是能够自动吐出堆栈跟踪而不影响发布代码或者甚至不需要重新启动它就非常方便程序

答案 4 :(得分:3)

Console.WriteLine(
    new System.Diagnostics.StackTrace().ToString()
    );

输出将类似于:

  

在YourNamespace.Program.executeMethod(String msg)

     

在YourNamespace.Program.Main(String [] args)

Console.WriteLine方法替换Log。其实有 Console.WriteLine情况不需要.ToString(),因为它接受 object。但是您可能需要Log(string msg)方法使用它。

答案 5 :(得分:-1)

   private void ExceptionTest()
    {
        try
        {
            int j = 0;
            int i = 5;
            i = 1 / j;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            var stList = ex.StackTrace.ToString().Split('\\');
            Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]);
        }
    }

似乎为我工作