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


132

我的工作区中有两个解决方案,分别是A和B。

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

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

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

但是,这非常不方便,我只能一次调试A ORB。

有没有办法进入参考的dll代码(我确实有其源代码)?


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

MSDN中可以找到有关如何设计解决方案的很好参考。


对于.net开发人员来说,该MSDN链接是必读的(无论他们使用什么源代码控制)。令我惊讶的是我之前没有看到它。谢谢!
2012年

新手,如果您已经了解项目引用,那么这不是一个选择(例如,您需要调试NuGet程序包),然后忽略已接受的答案,直接转到以下答案:stackoverflow.com/a/26029208/398630
BrainSlugs83

Answers:


113

如果您有项目参考,它应该立即起作用。

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

如果您不想复制任何文件,也可以直接在IDE中加载符号,但这需要更多工作。

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


3
不幸的是,我认为不可能从另一个解决方案向项目添加项目引用(如果我错了,请纠正我!)。
Elad

7
@Elad我就是这样做的。首先将“现有项目”添加到解决方案中。然后通过单击添加项目引用添加对项目的引用。您可以在现有项目文件中设置断点。很好,因为没有将文件复制过来。
user420667 2011年

3
我将DLL项目作为项目参考,但其中的断点被忽略。
斯拉夫(Slav)2014年

1
实际上,我今天能够调试(发布)程序集,该程序集已作为文件引用添加。对我有好处,但是那是怎么发生的呢?MSVC2010,C#(ASP).NET 4.0,引用的程序集以debug + release形式存在(但仅将release-file添加到项目中)。真的很想澄清这一点。
Tobias81'2014-12-12

1
对我来说,这一天有工作,但第二天却没有工作(具有DLL和PDB文件)。按下工具>选项>调试>符号上的“空符号缓存”按钮可以解决该问题。
保罗

45

我遇到过同样的问题。他是我发现的东西:

1)确保所有项目都使用相同的框架(这很关键!)

2)在工具/选项>调试>常规中,确保未选中“仅启用我的代码(仅受管理)”

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

4)在所有项目的“构建/配置管理器”菜单中,确保配置处于“调试”模式。


3
我的问题是我的两个项目使用了不同的.Net Frameworks:4.0和4.5。Tx!
user627283

1)和4)至关重要。不要忘记在Debug模式下构建并使用相同的框架。
scott_f

12

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


2
谢谢!这是我的问题。我不敢相信我没有弄清楚:-/我以为设置项目引用会以某种方式覆盖GAC中安装的内容。
SnookerC 2015年

绝对!这是非常好的一点。即使您具有相同版本的.NET Framework,如果您尝试调试时在GAC中包含代码,但如果GAC中的.PDB文件与项目文件夹中的.PDB文件不同,则不会遇到断点。一个解决方案是取消DLL的GAC,生成,然后重新GAC程序集。
DigiOz Multimedia

7

步骤1:进入“ 工具”->“选项”->“调试”

步骤2: 取消选中“仅启用我的代码”

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

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


3

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


1
此信息应包含在接受的答案中。它是我特别想要的。感谢分享!+1
Heriberto Lugo

2

当您要在引用的dll的源代码中设置断点时,首先请确保您有一个可用的pdb文件。然后,您可以打开相关的源代码文件并在此处设置断点。源文件不必是解决方案的一部分。如我如何在Visual Studio中的引用代码中设置断点所述?

您可以通过“断点”窗口查看断点,可通过“调试”->“ Windows”->“断点”查看。

这种方法的好处是,您无需仅为调试目的就将现有项目添加到解决方案中,因为省去了我的工作,从而节省了很多构建时间。显然,构建仅包含一个项目的解决方案比构建包含多个项目的解决方案要快得多。


1
仅当放置断点的外部文件与PDB中的确切路径匹配时,此方法才有效。(例如,仅当您在计算机上构建DLL时才有效。)
Josh M.


1

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

我的解决方案有一个“公共程序集”目录,其中包含其他项目中我自己的DLL。我引用的DLL也具有其随附的PDB文件用于调试。

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

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

这不是直截了当的,但是如果您不想包括新的项目引用,而只是想引用共享程序集,则可以使用。


0

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


0

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

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

  2. 转到程序集资源管理器>从NuGet程序包缓存中打开 项目清单

  3. 在搜索字段中键入要调试的NuGet软件包名称,然后单击“确定” 在此处输入图片说明

  4. 在程序集浏览器中,右键单击导入的程序集,然后选择“生成Pdb” 在此处输入图片说明

  5. 选择一个要保存.PDB文件的自定义路径,以及要为其生成该文件的框架。

    在此处输入图片说明

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


听起来不错,但我找不到任何Assembly Explorer;这不是Resharper的一部分吗?
罗伯特·马萨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.