23

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

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

编辑:

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

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

4

4 回答 4

14

如果 pdb 位于 dll 旁边(例如智能感知 xml 文件),通常(至少对我而言)会检测到 pdb。

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

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

于 2009-04-20T20:45:29.210 回答
6

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

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

于 2009-04-20T20:46:06.523 回答
6

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

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

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

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

在这种情况下,当然不可能从调试器进入方法(如预期/预期的那样)。

所以一切都按预期工作。非常感谢你的回答。

于 2009-04-22T12:42:38.620 回答
3

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

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

于 2009-04-21T01:28:58.233 回答