【问题标题】:How can I include line numbers in a stack trace without a pdb?如何在没有 pdb 的情况下在堆栈跟踪中包含行号?
【发布时间】:2010-11-22 15:57:51
【问题描述】:

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

【问题讨论】:

    标签: c# .net debugging deployment pdb-files


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我非常确定我可以将 IL 偏移量写入比 PDB 文件中的行号更小的版本。
      【解决方案4】:

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

      【讨论】:

      • 您不必将 PDB 文件发送到拥有 PDB 文件。只要在构建时将其存放在某个地方,就可以在获取堆栈跟踪时引用它。见stackoverflow.com/questions/1328836/…
      • 是的,这是真的。但是您必须拥有 PDB 文件才能获取此信息 - 因为这是编译器存储它的位置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 2014-10-22
      • 2013-12-31
      • 1970-01-01
      • 2015-04-09
      相关资源
      最近更新 更多