调试带有PDB文件的DLL发布版本

23
如果我有一个在 release 模式下构建的 DLL 文件,并且相应的 PDB 文件,是否可以调试(逐步执行)其中包含的类/方法?
如果可以,那么需要哪些步骤/配置(例如,把 PDB 文件放在哪里)?
编辑:
如果我在与 DLL 相同的位置(简单控制台测试应用程序的 bin/debug 目录中)有 PDB 文件。我可以看到 DLL 的符号已加载(在输出窗口和模块窗口中也可以看到),但仍然无法逐步执行该 DLL 中的方法。
这可能是编译器优化(如 Michael 在他的答案中所述)的结果吗?
4个回答

14

对我而言,pdb文件通常会与dll文件一起被检测到(例如Intellisense XML文件的情况)。

或者,在模块加载后需要设置断点...

在断点处,打开“模块”窗口(Ctrl+D,M-或Debug->Windows->Modules)。右键单击您的dll文件,“从中加载符号”,“符号路径”等。


4
PDB文件在DLL旁边,符号已被加载,但仍无法进入方法。有什么想法? - M4N

6

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

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

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

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

在这种情况下,从调试器中进入方法是不可能的(正如预期/意图的那样)。
所以一切都按照预期进行。非常感谢您的回答。

6
是的,您可以使用PDB调试发布代码。然而,在调试优化代码时存在一些陷阱,更多信息请参见此处此处
您的PDB只需要在调试器可以找到的地方 - 对于本地调试,与dll文件位于同一目录通常是最简单的。否则,请将其放在调试器可以找到的某个地方,并使用符号路径指向调试器。

3
调试发布版本比调试调试版本通常更加困难。一般来说,您需要一些对x86汇编的理解,并且可能需要花费一些时间查看反汇编窗口。这往往是唯一的方法,以确定您实际上正在哪一行代码上,因为在启用优化的发布版本中,编译器可能会进行重要的内联和指令重新排序。此外,我发现调试器经常无法正确报告变量的值。如果您需要知道变量的值并且不确定调试器是否正确,请进入反汇编窗口并找到其所在的内存位置或寄存器。 pdb文件可以存储在符号服务器中。请查看设置符号服务器以获得一个好的教程。我们在构建机器上构建的每个产品都会将符号发布到我们的符号服务器,因此我们始终可以调试从WinQual接收到的任何崩溃转储。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接