当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在.NET中打印当前的堆栈跟踪,没有任何异常?》经验,为你挑选了5个好方法。

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

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

Spence.. 375

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

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

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

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



1> Spence..:

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

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

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

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


请记住,"StackTrace"是**狗慢** - 所以请谨慎使用它.

2> larsmoa..:

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

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


@Daniel:是的,但是`System.Environment.StackTrace`可能是访问该信息的更方便的方式.
@Rory,看一下构造函数StackTrace(int skipFrames,bool fNeedFileInfo),可以跳过起始帧.在ILSpy中使用该方法,您可以看到它的作用
`Environment.StackTrace`刚好是一个`StackTrace`的实例.
@AndreiRinea:实际上,我相信您可以使用`System.Diagnostics.StackTrace`访问行号 - 请参阅http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe.getfilelinenumber.aspx
在System.Environment.get_StackTrace()`的System.Environment.GetStackTrace(Exception e,Boolean needFileInfo)中,`Environment.StackTrace`始终以``开头是不是很烦人?这不是当前堆栈跟踪的一部分,因为有人正在寻找它.

3> Brian Rasmus..:

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

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



4> Hank Schultz..:

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

    创建要在其中查看堆栈跟踪的断点.

    右键单击断点,然后在VS2015中选择"操作...".在VS2010中,选择"When Hit ...",然后启用"Print a message".

    确保选中"继续执行".

    输入您要打印的一些文字.

    在想要查看堆栈跟踪的位置添加$ CALLSTACK.

    在调试器中运行该程序.

当然,如果你在不同的机器上运行代码,这没有任何帮助,但是能够自动吐出堆栈跟踪而不影响发布代码或者甚至不需要重新启动程序就非常方便.


如果要查看堆栈跟踪,并且已经在VS调试器中的某个断点处,只需转到Debug-> Windows-> Call Stack。
是的,但如果你这样做,程序不必停下来看你的堆栈跟踪.

5> epox..:
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)方法。

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有