在基于异常的语言中,堆栈跟踪是用于诊断问题最重要的工具之一。在某些情况下,开发人员能得到的仅为一条简短的错误信息以及堆栈跟踪,尤其是当个人可识别信息(PII)约束限制了日志记录的内容时。
随着任务并行库(TPL)的出现以及紧随其后的async/await函数,堆栈跟踪变得愈发难以理解。 有效信息被隐藏起来的问题并不罕见。
事实上,该提升不可小觑。 在.NET 4.5早期版本以及引入ExceptionDispatchInfo类之前,堆栈跟踪是无法跨越异步边界的,开发人员将不得不深入探究内部异常问题。但所需研究的工作远不止于此。
Illyriad游戏开发商Ben Adams自行对.NET Core 2.1中的堆栈跟踪进行了改进提升。他的工作主要集中在以下这些领域:
消除由于async/await报警引入的噪音;
显示哪些方法重载是在异步或迭代器上下文中被调用的;
同时,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许可。