【发布时间】:2010-10-06 14:40:52
【问题描述】:
我有一个常规的 C# 代码。 我没有例外。我想以编程方式记录当前堆栈跟踪以进行调试。示例:
public void executeMethod()
{
logStackTrace();
method();
}
【问题讨论】:
标签: c# .net logging stack-trace printstacktrace
我有一个常规的 C# 代码。 我没有例外。我想以编程方式记录当前堆栈跟踪以进行调试。示例:
public void executeMethod()
{
logStackTrace();
method();
}
【问题讨论】:
标签: c# .net logging stack-trace printstacktrace
查看System.Diagnostics 命名空间。里面有很多好吃的!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
这真是太好了,可以四处看看以了解引擎盖下发生了什么。
我建议您查看日志解决方案(例如 NLog、log4net 或 Microsoft 模式和实践企业库),这些解决方案可能会实现您的目的,然后再实现一些目标。
【讨论】:
StackTrace 是 狗慢 - 所以要谨慎使用它。
System.Diagnostics.StackTrace 的替代方法是使用 System.Environment.StackTrace,它返回堆栈跟踪的字符串表示形式。
另一个有用的选项是使用$CALLER 和$CALLSTACK debugging variables in Visual Studio,因为这可以在运行时启用而无需重新构建应用程序。
【讨论】:
Environment.StackTrace just new 是 StackTrace 的一个实例。
System.Environment.StackTrace 可能是访问该信息的更方便的方式。
System.Diagnostics.StackTrace 访问行号 - 请参阅 msdn.microsoft.com/en-us/library/…
Environment.StackTrace 总是以at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace() 开头不是很烦人吗?这不是当前堆栈跟踪的一部分,因为有人正在寻找它。
有两种方法可以做到这一点。 System.Diagnostics.StackTrace() 将为您提供当前线程的堆栈跟踪。如果您引用了Thread 实例,则可以通过StackTrace() 的重载版本获取该实例的堆栈跟踪。
您可能还想查看 Stack Overflow 问题How to get non-current thread's stacktrace?。
【讨论】:
您也可以在 Visual Studio 调试器中执行此操作,而无需修改代码。
当然,如果您在另一台机器上运行代码,这将无济于事,但能够自动吐出堆栈跟踪而不影响发布代码甚至不需要重新启动程序。
【讨论】:
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) 方法可能需要它。
【讨论】:
这对我有用:
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]);
}
}
似乎对我有用
【讨论】: