我有一个常规的 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.Diagnostics.StackTrace
是使用System.Environment.StackTrace,它返回堆栈跟踪的字符串表示形式。
另一个有用的选项是在 Visual Studio$CALLER
中使用和调试变量,因为这可以在运行时启用而无需重新构建应用程序。$CALLSTACK
有两种方法可以做到这一点。这System.Diagnostics.StackTrace()
将为您提供当前线程的堆栈跟踪。如果你有一个Thread
实例的引用,你可以通过StackTrace()
.
您可能还想查看堆栈溢出问题如何获取非当前线程的堆栈跟踪?.
您也可以在 Visual Studio 调试器中执行此操作,而无需修改代码。
当然,如果您在另一台机器上运行代码,这无济于事,但是能够自动吐出堆栈跟踪而不影响发布代码甚至不需要重新启动程序会非常方便。
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) 方法可能需要它。
这对我有用:
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]);
}
}
似乎对我有用