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

How to print the current Stack Trace in .NET without any exception?

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

1
2
3
4
5
public void executeMethod()
{
    logStackTrace();
    method();
}

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

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

这是非常好的,可以随时了解最新情况。

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


System.Diagnostics.StackTrace的替代方法是使用System.Environment.StackTrace,它返回stacktrace的字符串表示形式。

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


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

您可能还想查看Stack Overflow问题如何获取非当前线程的堆栈跟踪?


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

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


    1
    2
    3
    Console.WriteLine(
        new System.Diagnostics.StackTrace().ToString()
        );

    输出类似于:

    at YourNamespace.Program.executeMethod(String msg)

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

    Log方法替换Console.WriteLine。实际上,有
    它接受的Console.WriteLine案例不需要.ToString()
    object。但是您可能需要使用Log(string msg)方法。


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
       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]);
            }
        }

    似乎为我工作