C# 调试DLL的发布版本(带有PDB文件)

C# 调试DLL的发布版本(带有PDB文件),c#,visual-studio-2008,debugging,pdb-files,C#,Visual Studio 2008,Debugging,Pdb Files,如果我有一个DLL(在发布模式下构建)和相应的PDB文件,是否可以调试(单步调试)该DLL中包含的类/方法 如果是,需要哪些步骤/配置(例如,将PDB文件放在何处) 编辑: 如果需要,请将PDB文件与DLL放在同一位置(在简单控制台测试应用程序的bin/debug目录中)。我可以看到DLL的符号已加载(在输出窗口和模块窗口中),但我仍然无法进入该DLL的方法 这可能是编译器优化的结果吗(如Michael在回答中所述)?如果pdb位于dll旁边(如intellisense xml文件),通常(至少

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

如果是,需要哪些步骤/配置(例如,将PDB文件放在何处)

编辑:

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

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

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

或者;在模块加载后,您需要一个断点


在断点处,打开“模块”窗口(Ctrl+D、M-或调试->窗口->模块)。右键单击dll“从中加载符号”、“符号路径”等。

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


您的PDB只需要位于调试器可以找到它的位置—对于本地调试,与dll相同的目录通常是最容易的。否则,请将其放置在调试器可以找到的位置,并使用符号路径将调试器指向该位置。

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


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

我终于找到了调试版本配置中构建的DLL时出现问题的原因:

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

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

[System.Diagnostics.DebuggerStepThrough]
public class MyClass {
    public void Test() { ... }
}
在这种情况下,当然不可能从调试器进入该方法(如预期/预期)


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

PDB位于DLL旁边,符号已加载,但我仍然无法进入方法。有什么想法吗?