399

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

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

7 回答 7

453

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

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

可以四处探索以了解引擎盖下发生的事情真是太好了。

我建议您查看日志解决方案(例如 NLog、log4net 或 Microsoft 模式和实践企业库),这些解决方案可能会达到您的目的,然后是一些。

于 2009-02-10T09:47:02.930 回答
250

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

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

于 2011-07-08T12:38:02.003 回答
39

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

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

于 2009-02-10T10:05:37.037 回答
18

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

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

当然,如果您在另一台机器上运行代码,这无济于事,但是能够自动吐出堆栈跟踪而不影响发布代码甚至不需要重新启动程序会非常方便。

于 2015-12-09T18:19:27.393 回答
11
Console.WriteLine(
    new System.Diagnostics.StackTrace().ToString()
    );

输出将类似于:

在 YourNamespace.Program.executeMethod(String msg)

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

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

于 2018-12-20T01:24:30.803 回答
1

这对我有用:

Debug.WriteLine(Environment.StackTrace);
于 2021-12-02T11:19:19.853 回答
-5
   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]);
        }
    }

似乎对我有用

于 2018-05-29T18:02:22.303 回答