如何打印当前的堆栈跟踪在。net没有任何异常?

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

public void executeMethod()
{
logStackTrace();
method();
}
212587 次浏览

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

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

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

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

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

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

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

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

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

  1. 在希望查看堆栈跟踪的位置创建断点。
  2. 在VS2015中右键单击断点并选择“Actions…”。在VS2010中,选择“When Hit…”,然后启用“Print a message”。
  3. 确保选择“继续执行”。
  4. 输入一些你想打印出来的文字。
  5. 在任何想要查看堆栈跟踪的地方添加$CALLSTACK。
  6. 在调试器中运行程序。

当然,如果您在不同的机器上运行代码,这是没有帮助的,但是能够在不影响发布代码或甚至不需要重新启动程序的情况下自动输出堆栈跟踪是非常方便的。

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

似乎对我有用

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

输出将类似于:

在YourNamespace.Program。executeMethod(字符串味精)

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

用你的Log方法替换Console.WriteLine。实际上,有 控制台不需要.ToString()。WriteLine的情况,因为它接受 object。但是你可能需要你的Log(string msg)方法

这招对我很管用:

Debug.WriteLine(Environment.StackTrace);