.NET/.NET Core 中更清晰的堆栈跟踪

  • Jonathan Allen
  • 翟雪冰

2018 年 2 月 12 日

话题:.NET语言 & 开发

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

在基于异常的语言中,堆栈跟踪是用于诊断问题最重要的工具之一。在某些情况下,开发人员能得到的仅为一条简短的错误信息以及堆栈跟踪,尤其是当个人可识别信息(PII)约束限制了日志记录的内容时。

随着任务并行库(TPL)的出现以及紧随其后的 async/await 函数,堆栈跟踪变得愈发难以理解。 有效信息被隐藏起来的问题并不罕见。

事实上,该提升不可小觑。 在.NET 4.5 早期版本以及引入 ExceptionDispatchInfo 类之前,堆栈跟踪是无法跨越异步边界的,开发人员将不得不深入探究内部异常问题。但所需研究的工作远不止于此。

Illyriad 游戏开发者 Ben Adams 自行对.NET Core 2.1 中的堆栈跟踪进行了改进提升。他的工作主要集中在以下这些领域:

  1. 消除由于 async/await 报警引入的噪音;
  2. 显示哪些方法重载是在异步或迭代器上下文中被调用的;

同时,Anirudh Agnihotry 更新了 Dictionary / ConcurrentDictionary 所采用的 KeyNotFoundException,以指出哪个关键字还未被发现,这曾是使.NET 开发人员重新回到 1.0 版本的主要困扰。

如果您已在使用.NET Framework,或不想再继续等待.NET Core 2.1 版本,那么你还可以通过调用 Ben.Demystifier 库以使用 Ben 的工作成果。这种方式可超越.NET Core 更新后可满足的功能,并使堆栈跟踪代码更接近于原始 C#代码,拥有更好的可读性。 (对于.NET Core 而言,这并不能算是可选方式之一,因为在 VB 或 F#堆栈跟踪中出现 C#关键字意义不大)。

.NET Core 是以 MIT 许可证发布的。 Ben.Demystifier 采用 Apache 许可。

查看英文原文: Cleaner Stack Traces in .NET/.NET Core


感谢冬雨对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

.NET语言 & 开发