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)。祝你好运伴侣!
-
请记住StackTrace是狗慢 - 所以要谨慎使用它。
-
^ IOW不要把它铲到生产代码中
System.Diagnostics.StackTrace的替代方法是使用System.Environment.StackTrace,它返回stacktrace的字符串表示形式。
另一个有用的选项是在Visual Studio中使用$CALLER和$CALLSTACK调试变量,因为这可以在不重建应用程序的情况下启用运行时。
-
Environment.StackTrace只是新的StackTrace的实例。
-
@Daniel:是的,但System.Environment.StackTrace可能是访问该信息的更方便的方式。
-
真正。但是如果你需要跳过一个框架或省略文件信息,你必须直接使用StackTrace。
-
@AndreiRinea:实际上,我相信你可以使用System.Diagnostics.StackTrace访问行号 - 请参阅msdn.microsoft.com/en-us/library/
-
Environment.StackTrace始终以at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()开头是不是很烦人?这不是当前堆栈跟踪的一部分,因为有人正在寻找它。
-
@Rory,看一下构造函数StackTrace(int skipFrames,bool fNeedFileInfo),可以跳过起始帧。在ILSpy中使用该方法,您可以看到它的作用
有两种方法可以做到这一点。 System.Diagnostics.StackTrace()将为您提供当前线程的堆栈跟踪。如果您有对Thread实例的引用,则可以通过StackTrace()的重载版本获取堆栈跟踪。
您可能还想查看Stack Overflow问题如何获取非当前线程的堆栈跟踪?
您也可以在Visual Studio调试器中执行此操作,而无需修改代码。
创建要在其中查看堆栈跟踪的断点。
右键单击断点,然后在VS2015中选择"操作..."。在VS2010中,选择"When Hit ...",然后启用"Print a message"。
确保选中"继续执行"。
输入您要打印的一些文字。
在想要查看堆栈跟踪的位置添加$ CALLSTACK。
在调试器中运行该程序。
当然,如果你在不同的机器上运行代码,这没有任何帮助,但是能够自动吐出堆栈跟踪而不影响发布代码或者甚至不需要重新启动程序就非常方便。
-
如果要查看堆栈跟踪并且您已经在断点处的VS调试器中,只需转到Debug-> Windows-> Call Stack。
-
是的,但如果你这样做,程序不必停下来看你的堆栈跟踪。
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]);
}
} |
似乎为我工作
-
这只会产生一个明显的例外。为什么?为什么不简单地显式实例化一个异常,而不是一个会引发异常的缺陷呢?获得实际异常所需的额外捕获逻辑有什么好处?即便如此,你仍然无视实际发布的关于如何获得堆栈跟踪而没有任何异常的问题(阅读标题)。
-
这是一个有效的答案,但是一个可怕的解决方案。没有人应该使用它... @Jeff无论你做到了什么,用下降代码替换它,就像建议的其他答案一样。