31

我们目前正在分发一个没有 .pdb 文件的 WinForms 应用程序,以节省客户端计算机上的空间和下载带宽。当我们得到堆栈跟踪时,我们得到的是方法名,而不是行号。有没有办法在不分发 .pdb 文件的情况下获取行号?

4

4 回答 4

38

除非捆绑 PDB,否则无法直接从应用程序获取带有行号的堆栈跟踪。 但是,如果您拥有与交付给客户的应用程序版本相同的 PDB 文件,并且您不介意一些简单的脚本,那么您可以将 .NET 堆栈跟踪和 IL 偏移转换回行号。

在您的构建过程中,使用Mike Stall 的 pdb2xml 转换器,作为他出色的MDbg 托管代码调试器的一部分分发,并将它们存储在某个安全的地方(例如,源代码控制)。当您从客户端获得堆栈跟踪时,您可以从 XML 数据中查询 IL 偏移量以确定相关的行号。如果您的堆栈跟踪被提交到网站,您甚至可以自动转换,以便开发人员在案例进入收件箱时已经获得完整详细的堆栈跟踪。

于 2009-08-25T15:10:57.313 回答
8

不,行号是调试信息的一部分,它只存储在 PDB 文件中。这就是 PDB 文件首先存在的原因。

于 2009-08-25T14:57:46.820 回答
1

不是您问题的适当答案,但我有一个建议。您可以合并一个日志记录机制,并在堆栈跟踪旁边获取这些日志文件。如果您在日志消息中包含行号,则可以手动将日志记录信息与堆栈跟踪结合起来。

如果您不想占用太多空间,您可以使用有限大小的日志文件,这样只会保留最新的日志消息。

我们使用 log4net 库来满足我们的日志记录需求,我建议你看看。

于 2009-08-25T15:02:16.457 回答
0

不,那里没有。将 IL 行映射到原始源文件和行号所需的所有信息都存储在 PDB 中。如果没有 PDB,就不可能在堆栈跟踪中获取该信息。

于 2009-08-25T14:58:08.553 回答