【问题标题】:C# Interface Debug Information not linked to sourcesC# 接口调试信息未链接到源
【发布时间】:2011-11-17 10:55:15
【问题描述】:

我正在尝试重新调整一个非常大的解决方案的布局,该解决方案已经变得非常难以(并且很快)使用。我的计划是创建一些包含相关项目的解决方案,然后在必要时使用二进制引用链接到其他解决方案生成的库。

我们依靠 Resharper 的 Navigate to External Sources 功能使其可用,因此我们可以轻松地浏览我们从其他解决方案引用的项目的源代码。为什么 VS 不能开箱即用地做到这一点,我无法理解。

对于具有实现的类来说,这一切都非常好。但是,对于仅包含自动实现属性的 C# 接口和类,Resharper 无法浏览到源代码,并回退到粗糙的元数据查看器。

我使用了 srctool.exe,它是 MS Debugging Tools For Windows 中的 Symbol Server 工具附带的,用来浏览 .pdb 文件中列出的源代码,很明显这些接口和空(ish)类的源代码是未在 pdb 文件中引用。如果我将自动实现的属性切换为具有支持字段的属性,则源链接会出现在 pdb 中。

我猜测源被排除在外,因为没有地方可以在接口和自动实现的属性上设置断点。

不过,我想知道,如果有一些特殊的编译器选项或解决方法,我们可以采用强制 PDB 文件包含对 C# 接口源的引用。

谢谢, 标记

【问题讨论】:

  • 请注意:如果您的答案包含“IoC”“DI Container”或 cabbages 之类的词,那么我不想听到它。 :)
  • 您能否尝试验证 .NET 2/3.5 的相同行为?
  • @Mark out of Interest 你用什么命令通过 srctool.exe 浏览 pdb 中的源代码?, srctool your.pdb -r ?
  • @Mark 这是一个最重要的问题,我只能建议询问史蒂夫约翰逊(sosex 名声)谁应该能够给你一个想法什么是可能的。查看stevestechspot.com
  • @wal 是的,srctool -r 是命令。

标签: c# .net-4.0 debug-symbols resharper-6.0


【解决方案1】:

这个问题没有足够的细节。突然间,我猜您通过将项目引用转换为程序集引用来解决缓慢的大规模解决方案的问题。并以这些项目的 Release 版本作为参考。

是的,这让任何试图从 PDB 中查找源代码文件的工具都难以抗拒。 .NET 项目的发布版本使用 PDB 的 剥离 版本,所有源代码文件和行号信息已从中删除。这对于 real 发布版本来说是一件很正常的事情。发布构建的代码通常是优化的。这会导致代码重新排序,不再匹配源文件中代码的逻辑位置。您从源 + 行 PDB 信息中获得的任何信息现在往往介于有害和无用之间,您开始在错误的地方寻找问题。

然而,这对于 IDE 工具或在调试您的应用程序时不是问题。在这种情况下,优化器会自动禁用。实际上是VS中的一个配置项:Tools + Options,Debugging,General,“Suppress JIT optimization on module load”选项。默认开启。

显然,任何使用 PDB 的工具在没有机会找到源文件时都会紧张。修复方法是返回原始项目,再次选择发布配置并更改设置:项目+属性,构建选项卡,向下滚动,高级按钮。将“调试信息”组合从“pdb-only”更改为“full”。重建项目。

应该可以解决您的问题。还恢复调试器,你可以再次进入源代码。

顺便说一句,不要过多地移动文件,否则您可能会再次陷入困境。至少将 PDB 与 DLL 保持在同一目录中。如果源代码不再存在于同一目录中,但您在另一个目录中再次检出它,那么您必须告诉 IDE。右键单击解决方案、属性、调试源文件设置。

【讨论】:

  • 看来,你误解了这个问题。对我来说,这听起来像是“如何将接口源信息写入 PDB?”。例如,我无法在 NHibernate 的 PDB 文件中找到 ISession 接口的任何源引用——同样的问题涉及 NHibernate 的所有接口类型。
  • 嗯,这不是你的问题,所以我没有暗示这与 NHibernate 有任何关系。它仍然适用,NHibernate 肯定会按照我描述的方式构建,您将获得带有剥离 PDB 的 Release 构建。它是开源的,所以按照我记录的方式修复它并不是问题。
  • 但是 PDB(例如,NHibernate 的那个)包含关于类的完整信息,它没有关于接口的信息。这就是问题的重点。
  • 嗯,你使用的神秘工具可能只处理有代码的类。接口没有。 ping 工具供应商。尽管他可能会告诉您,您从 Visual Studio 的“转到定义”命令中获得的自动生成声明已经与原始声明无法区分,因此应该可以正常工作。
  • 我的问题与发布模式无关。碰巧的是,我使用的是调试模式构建,但发布模式构建中也有 PDB 引用,所以根本不要“阻碍”IDE。 IDE 工具可以找到大多数东西的源文件,但不能找到没有显式实现的简单类。元数据查看器可以或多或少地重新构建源代码,但是您将丢失代码 cmets(不包括 /// cmets,如果您有程序集元数据 xml),并且还无法编辑源文件。
猜你喜欢
  • 2011-12-11
  • 2013-11-23
  • 2016-02-21
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多