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

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

当前回答

有两种方法。System.Diagnostics.StackTrace()将为您提供当前线程的堆栈跟踪。如果您有一个线程实例的引用,您可以通过StackTrace()的重载版本获得该实例的堆栈跟踪。

你可能还想查看Stack Overflow问题如何获得非当前线程的stacktrace?

其他回答

这招对我很管用:

Debug.WriteLine(Environment.StackTrace);

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

另一个有用的选项是在Visual Studio中使用$CALLER和$CALLSTACK调试变量,因为这可以在运行时启用,而无需重新构建应用程序。

有两种方法。System.Diagnostics.StackTrace()将为您提供当前线程的堆栈跟踪。如果您有一个线程实例的引用,您可以通过StackTrace()的重载版本获得该实例的堆栈跟踪。

你可能还想查看Stack Overflow问题如何获得非当前线程的stacktrace?

看看系统。诊断名称空间。里面有很多好吃的东西!

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

这是一个很好的窥探,以了解在引擎盖下发生了什么。

我建议你看看日志解决方案(如NLog, log4net或微软模式和实践企业库),它们可能会达到你的目的。

   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]);
        }
    }

似乎对我有用