【问题标题】:Debugging a release version of a DLL (with PDB file)调试 DLL 的发布版本(使用 PDB 文件)
【发布时间】:2010-04-14 08:34:37
【问题描述】:

如果我有一个 DLL(在发布模式下构建)和相应的 PDB 文件,是否可以调试(单步执行)该 DLL 中包含的类/方法?

如果是这样,需要哪些步骤/配置(例如,将 PDB 文件放在哪里)?

编辑:

如果 PDB 文件与 DLL 位于同一位置(在简单控制台测试应用程序的 bin/debug 目录中)。我可以看到 DLL 的符号已加载(在“输出”窗口和“模块”窗口中),但我仍然无法进入该 DLL 的方法。

这可能是编译器优化的结果吗(正如 Michael 在他的回答中所描述的那样)?

【问题讨论】:

    标签: c# visual-studio-2008 debugging pdb-files


    【解决方案1】:

    如果 pdb 位于 dll 旁边(就像 intellisense xml 文件一样),通常(至少对我而言)会检测到它。

    或者;模块加载后你需要一个断点...

    在断点处,调出“模块”窗口(Ctrl+D,M - 或 Debug->Windows->Modules)。右键单击您的 dll “加载符号来自”、“符号路径”等。

    【讨论】:

    • PDB 在 DLL 旁边,符号已加载,但我仍然无法进入方法。有什么想法吗?
    【解决方案2】:

    是的,您可以使用 PDB 调试发布代码。然而,调试优化代码存在一些陷阱,更多信息herehere

    您的 PDB 只需要位于调试器可以找到它的位置 - 对于本地调试,与 dll 相同的目录通常是最简单的。否则,将它放在调试器可以找到的某个位置,并将调试器指向带有符号路径的那个位置。

    【讨论】:

      【解决方案3】:

      我终于找到了调试在发布配置中构建的 DLL 出现问题的原因:

      首先,它基本上按预期工作。这意味着,如果我有一个在发布配置中构建的 DLL 以及相应的 PDB 文件,那么我可以调试该 DLL 中包含的类/方法。

      当我第一次尝试这个时,不幸的是我试图进入一个具有 DebuggerStepThroughAttribute 的类的方法,例如:

      [System.Diagnostics.DebuggerStepThrough]
      public class MyClass {
          public void Test() { ... }
      }
      

      在这种情况下,当然不可能从调试器中单步执行该方法(如预期/预期的那样)。

      所以一切都按预期进行。非常感谢您的回答。

      【讨论】:

        【解决方案4】:

        调试发布版本通常比调试调试版本更难。一般来说,您需要对 x86 汇编器有所了解,并且您可能会花一些时间查看反汇编窗口。这往往是确定您真正使用哪一行代码的唯一方法,因为在对编译器进行优化的发布版本中,可能会进行重要的内联和指令重新排序。此外,我发现调试器经常无法正确报告变量的值。如果您需要知道变量的值并且不确定调试器是否正确,请进入反汇编窗口并找到它所在的内存位置或寄存器。

        pdb 文件可以存储在符号服务器中。查看Setting up a Symbol Server 以获得很好的教程。我们在构建机器上构建的每个产品都会将符号发布到我们的符号服务器,因此我们始终可以调试从 WinQual 收到的任何故障转储。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-23
          • 1970-01-01
          • 2019-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多