如何调试引用的dll(有pdb)

时间:2009-07-15 09:43:08

标签: c# visual-studio visual-studio-2008 visual-studio-2005

我的工作区有两个解决方案,比如A和B.

解决方案A是一个较旧的项目,我在前一段时间完成了编码。 在解决方案B中,我需要使用解决方案A中的一些类。为此,我在解决方案A中添加了对其中一个项目的dll的引用。

问题是当我尝试调试时。我希望能够进入A的代码。 Visual Studio无法加载这些类的代码(“当前位置没有可用的源代码。”)我只能查看反汇编,这是无用的。

我知道从解决方案A调试类的唯一方法是运行解决方案B,分离所有进程(在Debug菜单项中)并从解决方案A附加进程。

然而,这非常不方便,我只能一次调试A OR B.

有没有办法允许单步执行引用的dll代码(我有源代码)?


解决方案:我的错误是我认为项目只能是单一解决方案的一部分。事实上,一个项目可以成为许多解决方案的一部分 当您需要引用旧项目时,您只需将项目添加到解决方案中。通过右键单击解决方案资源管理器中的新解决方案>来完成此操作。添加>现有项目。
然后,您将能够添加项目引用。正如其他人所写,你应该完全避免使用dll引用你自己的代码(或者你可能需要更改和调试的其他代码)。

可以在MSDN中找到关于如何设计解决方案的非常好的参考。

11 个答案:

答案 0 :(得分:94)

如果您有项目参考,则应立即生效。

如果是文件(dll)引用,则需要将调试符号(“pdb”文件)与dll放在同一文件夹中。检查您的项目是否正在生成调试符号(项目属性=> Build => Advanced => Output / Debug Info = full);如果您已经复制了 dll,请将pdb与它放在一起。

如果您不想复制任何文件,也可以直接在IDE中加载符号,但这样做更有效。

最简单的选择是使用项目引用!

答案 1 :(得分:39)

我有同样的问题。他就是我找到的:

1)确保所有项目都使用相同的框架(这是至关重要的!)

2)在工具/选项>调试>一般确保"启用仅我的代码(仅限管理)未勾选

3)在工具/选项>调试>符号中清除所有缓存的符号,取消并删除"符号文件(.pdb)位置下的所有文件夹位置"列表框除了默认的" Microsoft符号服务器"但还是要解开它。同时删除此目录中" Cache符号中的所有静态路径"文本框。单击"空符号缓存"按钮。最后确保"仅指定模块"选中了单选按钮。

4)在所有项目的Build / Configuration Manager菜单中,确保配置处于Debug模式。

答案 2 :(得分:9)

要记住的另一点是,请确保GAC中未安装引用的dll。经过测试,我将我的dll安装到GAC中进行系统级测试。后来,当我不得不再次调试我的代码时,我无法进入引用的程序集,直到我从GAC中删除它们。

答案 3 :(得分:3)

第1步:转到工具 - >选项 - >调试

第2步:取消选中启用我的代码

第3步:取消选中要求源文件与原始版本完全匹配

第4步:取消选中“跳过属性和运算符”

答案 4 :(得分:2)

如果要在引用的dll的源代码中设置断点,请首先确保您有可用的pdb文件。然后你可以打开相关的源代码文件并在那里设置断点。源文件不需要是解决方案的一部分。 正如How can I set a breakpoint in referenced code in Visual Studio?

中所述

您可以通过Breakpoints窗口查看断点,可通过Debug - >获得。 Windows - >断点。

这种方法的好处是,您不需要将现有项目添加到解决方案中仅用于调试目的,因为将其留下来可以节省大量的构建时间。显然,构建一个只有一个项目的解决方案比构建一个包含大量项目的解决方案要快得多。

答案 5 :(得分:1)

我不想在我的某些解决方案中包含外部类库项目,因此我会以不同的方式进入我使用的程序集。

我的解决方案有一个“Common Assemblies”目录,其中包含我自己的其他项目的DLL。我引用的DLL也有它们附带的PDB文件用于调试。

为了调试和设置断点,我在消费应用程序的源代码中设置了一个断点,我从程序集中调用方法或构造函数,然后单步执行INTO(F11)方法/构造函数调用。

调试器将在VS中加载程序集的源文件,并且可以在该点设置程序集内部的新断点。

这不是直截了当的,但如果您不想包含新的项目引用并且只想引用共享程序集,则可以正常工作。

答案 6 :(得分:1)

我在同一文件夹中保存了*.pdb个文件,并使用了Arindam中的选项,但是仍然无法正常工作。原来,我需要启用启用本机代码调试,该功能可在项目属性>调试下找到。

答案 7 :(得分:1)

确保您的DLL未在GAC中注册。 Visual Studio将在GAC中使用该版本,并且可能没有调试信息。

答案 8 :(得分:0)

必须有效。我曾经同时调试.exe文件和dll! 我建议的是 1)在B项目中包含dll的路径, 2)然后编译调试你的A项目 3)控制路径指向A dll和de pdb文件.... 4)之后你开始调试B项目,如果一切正常,你将能够在两个项目中进行调试!

答案 9 :(得分:0)

我发现使用VisualStudio 2019调试NuGet中要引用的外部库的最直接的方法是采取以下步骤:

  1. 工具>选项>调试>常规>取消选中“仅启用我的代码”

  2. 转到Assembly Explorer>从NuGet包缓存中打开 List item

  3. 在搜索字段中键入要调试的NuGet软件包名称,然后单击“确定”。 enter image description here

  4. 从Assembly Explorer中,右键单击导入的装配,然后选择'Generate Pdb' enter image description here

  5. 选择要在其中保存.PDB文件和所需框架的自定义路径 为此生成

    enter image description here

  6. 将生成的文件夹中的.PDB文件复制到Debug文件夹中,您现在可以设置 该程序集的库代码上的断点

答案 10 :(得分:0)

以下解决方案对我有用。它涉及将 .dll 和 .pdb 文件从项目 A 正确复制粘贴到 B: https://stackoverflow.com/a/16546777/5351410