首先,问题: 我有几个免费项目,并且与任何软件一样,它们都包含错误。遇到错误时,一些其他用户会向我发送带有堆栈跟踪的错误报告。为了简化查找故障位置,我想查看此堆栈跟踪中的行号。如果应用程序没有 .pdb 文件,那么所有行信息都会丢失,所以目前我所有的项目都部署了 .pdb 文件,因此生成的堆栈跟踪有这个数字。但!但我不想在分发中看到这些文件,并且想删除所有 .pdb。它们使用户感到困惑,在安装程序中占用空间等。
Delphi 解决方案: 很久以前,当我还是一名 Delphi 程序员时,我使用了以下技术:在异常时,我的应用程序在堆栈上行走并收集地址。然后,当我收到错误报告时,我使用了一个工具,该工具根据收集的地址和位于我机器上的相应符号文件,使用函数名称和行号重建有效堆栈跟踪。
问题: .NET 中是否有任何库、技术或任何可以做同样事情的东西?
状态更新:非常有趣,经常提问是开始自己调查的最佳方式。例如,我考虑了这个问题一段时间,但几天前才开始寻找答案。
选项 1:小型转储。经过大量谷歌搜索后,我找到了一种从代码创建迷你转储的方法,以及如何从托管迷你转储重新创建堆栈。
- 可再发行程序集创建迷你转储表单代码 - clrdump
- 关于使用以前的程序集的博客文章 -在 .NET 生产应用程序中创建和分析小型转储
然而,这个解决方案需要重新分配两个额外的程序集(大约 1mb 大小),并且迷你转储需要一些空间,并且用户通过电子邮件发送它们很不舒服。所以就我的目的而言,现在,这是不可接受的。
选项 2:感谢 weiqure 提供线索。可以为每个堆栈帧提取托管 IL 偏移量。现在的问题是如何根据这个偏移量从 .pdb 中获取行号。我发现了什么:
- PDB File Internals,仅供参考,因为:
- ISymbolReader - 用于读取程序数据库文件的托管接口
- 最后是一个将 .pdb 文件转换为结构化 xml以便于 xpath 处理的工具
使用此工具,可以为每个发布版本创建 xml 文件并将它们放入存储库。当用户机器上发生异常时,可以创建带有 IL 偏移量的格式化错误消息。然后用户通过邮件发送此消息(非常小)。最后,可以创建一个简单的工具,从格式化的错误消息重新创建结果堆栈。
我只是想知道为什么没有人不实现这样的工具?我不相信这只是对我感兴趣。