我有一个常规的C#代码。 我没有例外 。我想以编程方式记录当前堆栈跟踪以进行调试。例如:
public void executeMethod()
{
logStackTrace();
method();
}
答案 0 :(得分:350)
查看System.Diagnostics
命名空间。那里有很多好吃的东西!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
如果想要了解最新情况,那真是太好了。
我建议您查看可能达到您的目的的日志记录解决方案(例如NLog,log4net或Microsoft模式和实践Enterprise Library)。祝你好运![/ p>
答案 1 :(得分:195)
System.Diagnostics.StackTrace
的替代方法是使用System.Environment.StackTrace返回堆栈跟踪的字符串表示。
另一个有用的选项是使用$CALLER
和$CALLSTACK
debugging variables in Visual Studio,因为这可以在不重建应用程序的情况下启用运行时。
答案 2 :(得分:37)
有两种方法可以做到这一点。 System.Diagnostics.StackTrace()
将为您提供当前线程的堆栈跟踪。如果您有对Thread
实例的引用,则可以通过StackTrace()
的重载版本获取堆栈跟踪。
您可能还想查看Stack Overflow问题 How to get non-current thread's stacktrace? 。
答案 3 :(得分:13)
您也可以在Visual Studio调试器中执行此操作,而无需修改代码。
当然,如果你在不同的机器上运行代码,这没有任何帮助,但是能够自动吐出堆栈跟踪而不影响发布代码或者甚至不需要重新启动它就非常方便程序
答案 4 :(得分:3)
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
输出将类似于:
在YourNamespace.Program.executeMethod(String msg)
在YourNamespace.Program.Main(String [] args)
用Console.WriteLine
方法替换Log
。其实有
Console.WriteLine情况不需要.ToString()
,因为它接受
object
。但是您可能需要Log(string msg)方法使用它。
答案 5 :(得分:-1)
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]);
}
}
似乎为我工作