我有一段常规的C#代码。没有任何异常。为了调试目的,我想要以编程方式记录当前堆栈跟踪。示例:
public void executeMethod()
{
logStackTrace();
method();
}
我有一段常规的C#代码。没有任何异常。为了调试目的,我想要以编程方式记录当前堆栈跟踪。示例:
public void executeMethod()
{
logStackTrace();
method();
}
看一下System.Diagnostics
命名空间,里面有很多好东西!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
这真的很好,可以深入了解底层发生的事情。
我建议您研究一下日志记录解决方案(例如NLog、log4net或Microsoft模式和实践企业库),这些解决方案可能实现您的目的,甚至更多。
使用System.Environment.StackTrace代替System.Diagnostics.StackTrace
,可以返回堆栈跟踪的字符串表示形式。
另一个有用的选项是在Visual Studio中使用$CALLER
和$CALLSTACK
调试变量,因为这可以在运行时启用而无需重新构建应用程序。
Environment.StackTrace
只是新建了一个 StackTrace
实例。 - DanielSystem.Environment.StackTrace
可能是更方便的访问该信息的方式。 - larsmoaSystem.Diagnostics.StackTrace
访问行号 - 请参见 http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe.getfilelinenumber.aspx - larsmoaEnvironment.StackTrace
总是以at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()
开头,这难道不令人烦恼吗?因为这并不属于当前堆栈跟踪,而只是在某些人寻找它时的一个参考点。 - Rory有两种方法可以实现这一点。 System.Diagnostics.StackTrace()
将为您提供当前线程的堆栈跟踪。如果您有对 Thread
实例的引用,则可以通过重载版本的 StackTrace()
获取该线程的堆栈跟踪。
您还可以查看Stack Overflow问题 “如何获取非当前线程的堆栈跟踪?”。
你也可以在不修改代码的情况下,在Visual Studio调试器中完成此操作。
当然,如果您在不同的计算机上运行代码,则这并没有帮助,但能够自动输出堆栈跟踪而无需影响发布代码甚至无需重新启动程序可能非常方便。
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
输出结果将类似于:
请用您的在YourNamespace.Program.executeMethod(String msg)处
在YourNamespace.Program.Main(String[] args)处
Log
方法替换Console.WriteLine
方法。 实际上,对于Console.WriteLine情况,不需要.ToString()
,因为它接受object
。 但是您可能需要为您的Log(string msg)方法使用它。这个方法对我有用:
Debug.WriteLine(Environment.StackTrace);
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]);
}
}
对我来说似乎可以工作
StackTrace
非常缓慢,因此要谨慎使用。 - Jonathan Dickinsont.ToString()
来获取堆栈跟踪的字符串表示形式,这可能是OP想要的。 - Sasinonew System.Diagnostics.StackTrace(true)
。 - David Raab