等效于 System.Diagnostics.StackTrace 的 C# 可移植类库
Posted
技术标签:
【中文标题】等效于 System.Diagnostics.StackTrace 的 C# 可移植类库【英文标题】:C# Portable Class Library Equivalent of System.Diagnostics.StackTrace 【发布时间】:2015-02-24 06:42:21 【问题描述】:我正在处理的一个程序有一个适当地命名为“错误”的日志记录功能,可以在不使程序崩溃的情况下通知错误,但是,我想包含一个堆栈跟踪,以便可以更轻松地调试这些非致命错误。我的第一直觉是使用System.Diagnostics.StackTrace
,不幸的是,这在 PCL 中不可用。
然后,我尝试抛出并及时捕获异常。
try throw new Exception();
catch (Exception ex) return ex.StackTrace;
不幸的是,这仅提供了调用堆栈的顶部:由于它不会在向下的过程中解开堆栈,因此它不会提供任何有用的信息。所以,我的问题是:如何在 ac# PCL 函数中获取堆栈跟踪而不抛出错误并将其捕获到堆栈底部?我更愿意将代码完全保留在PCL 并避免对如此琐碎的事情使用抽象和特定于平台的实现代码。
编辑为对评论的响应:`throw new Exception(ex) 仅向堆栈跟踪添加另一层,因此堆栈跟踪函数中有两行但仍无法检索完整跟踪。
【问题讨论】:
我认为您在这里大多不走运。ex.ToString()
是否包含堆栈跟踪?你可能不得不这样做。或者throw new Exception(ex);
前者不行,让我去试试后者,更新问题。
【参考方案1】:
尝试使用Environment.StackTrace property。
StackTrace 属性按时间倒序列出方法调用 顺序,即最先描述最近的方法调用,并且 每个方法调用都会列出一行堆栈跟踪信息 堆栈。但是,StackTrace 属性可能不会报告那么多 由于期间发生的代码转换,方法调用按预期进行 优化。
编辑:
版本描述似乎在声明Environment class is supported by PCL:
版本信息 .NET Framework 支持:4.6、4.5、4、3.5、 3.0、2.0、1.1、1.0 .NET Framework 客户端配置文件 受支持:4、3.5 SP1 可移植类库 受支持:可移植类库 .NET 适用于 Windows 应用商店应用 支持:Windows 8 支持:Windows Phone 8.1 支持:Windows Phone Silverlight 8.1 支持: Windows Phone Silverlight 8
【讨论】:
很遗憾,Environment.StackTrace 在 PCL 中不可用。 @ColorfullyMonochrome,请查看我的编辑。 PCL似乎支持Environment类。确保您的项目正在使用 System.Environment 是的,Environment 类是支持的,但是几乎没用。除CurrentManagedThreadId
、FailFast()
、HasShutdownStarted
、NewLine
、ProcessorCount
和 TickCount
之外的所有内容均已删除。
我发现 MSDN 在有关 PCL 的文档方面经常出错。也就是说,由于您所针对的 PCL 配置文件,您可能还缺少该成员。选择具有更多平台的配置文件可能会限制您可以访问的内容(因为它是最低公分母)。无论如何,MSDN 说(Environment.StackTrace
):版本信息 .NET Framework 支持:4.6、4.5、4、3.5、3.0、2.0、1.1、1.0 .NET Framework 客户端配置文件支持:4、3.5 SP1
我通过 Visual Studio 中的智能感知检查了可用的内容。可能是 PCL 配置文件,但支持的平台列表并未明确包括 PCL 或 Windows 应用商店。如果您查看 MSDN 上的 Environment.TickCount
,就会明确提到 PCL 支持。 msdn.microsoft.com/en-us/library/…以上是关于等效于 System.Diagnostics.StackTrace 的 C# 可移植类库的主要内容,如果未能解决你的问题,请参考以下文章