【问题标题】:How to debug a referenced dll (having pdb)如何调试引用的 dll(具有 pdb)
【发布时间】:2009-07-15 09:43:07
【问题描述】:

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

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

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

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

但是,这很不方便,我只能一次调试 A OR B。

有没有办法允许进入引用的 dll 的代码(我有源代码)?


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

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

【问题讨论】:

  • 该 MSDN 链接是 .net 开发人员必读的内容(无论他们使用何种源代码控制)。我很惊讶我之前没有看到它。谢谢!
  • 新手,如果您已经了解项目引用,并且这不是一种选择(例如,您需要调试 NuGet 包),那么请忽略已接受的答案并直接进入这个答案:stackoverflow.com/a/26029208/398630

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


【解决方案1】:

如果您有 项目 参考,它应该可以立即工作。

如果是文件 (dll) 引用,您需要将调试符号(“pdb”文件)与 dll 放在同一文件夹中。检查您的项目是否正在生成调试符号(项目属性 => 构建 => 高级 => 输出/调试信息 = 完整);如果您有复制 dll,请将 pdb 与它放在一起。

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

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

【讨论】:

  • 不幸的是,我认为不可能将项目引用添加到另一个解决方案中的项目(如果我错了,请纠正我!)。
  • @Elad 我刚刚做了这个。首先将“现有项目”添加到解决方案中。然后通过单击添加项目引用来添加对项目的引用。您可以在现有项目文件中设置断点。这很好,因为文件不会被复制。
  • 我有 DLL 项目作为项目引用,但其中的断点被忽略。
  • 我今天实际上能够调试一个(发布)程序集,它被添加为文件引用。对我有好处,但这是怎么发生的? MSVC2010,C#,(ASP).NET 4.0,引用的程序集作为调试+发布存在(但只有发布文件添加到项目中)。真的很想澄清这一点。
  • 对我来说它工作了一天,但第二天就没有工作(有 DLL 和 PDB 文件)。按工具>选项>调试>符号上的“空符号缓存”按钮修复它。
【解决方案2】:

我遇到了同样的问题。他就是我发现的:

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

2) 在工具/选项>调试>常规中确保“仅启用我的代码(仅限托管)未勾选

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

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

【讨论】:

  • 我的问题是我的两个项目使用了不同的 .Net 框架:4.0 和 4.5。发送!
  • 1) 和 4) 至关重要。不要忘记在调试模式下构建并使用相同的框架。
【解决方案3】:

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

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

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

第 4 步:取消选中 Step over Properties and Operators

第 5 步:转到项目属性-->调试

第 6 步:勾选启用本机代码调试

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 谢谢!这是我的问题。我不敢相信我没有弄清楚这一点:-/我认为设置项目引用会以某种方式覆盖 GAC 中安装的内容。
    • 绝对!这是一个非常好的观点。即使您拥有相同版本的 .NET Framework,如果您在尝试调试时 GAC 中有代码,如果 GAC 中的 .PDB 文件与项目文件夹中的不同,它也不会遇到断点。解决方案是取消 GAC DLL,构建,然后重新 GAC 程序集。
    【解决方案5】:

    我将*.pdb 文件放在同一个文件夹中,并使用了Arindam 中的选项,但它仍然不起作用。原来我需要启用启用本机代码调试,这可以在项目属性>调试下找到。

    【讨论】:

    • 此信息应包含在已接受的答案中。它是我专门寻找的。感谢分享! +1
    【解决方案6】:

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

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

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

    【讨论】:

    • 这仅在您放置断点的外部文件与 PDB 中的确切路径匹配时才有效。 (例如,仅当您在计算机上构建 DLL 时才有效。)
    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

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

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

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

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

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

      【讨论】:

        【解决方案9】:

        我发现使用 VisualStudio 2019 调试您在 NuGet 中引用的外部库的最直接方法是执行以下步骤:

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

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

        3. 在搜索字段中键入要调试的 NuGet 包名称并单击“确定”

        4. 在程序集资源管理器中,右键单击导入的程序集并选择“生成 数据库'

        5. 选择要保存 .PDB 文件的自定义路径和所需的框架 这是为

          生成的

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

        【讨论】:

        • 听起来不错,除了我找不到任何 Assembly Explorer;这不是 Resharper 的一部分吗?
        【解决方案10】:

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

        【讨论】:

          【解决方案11】:

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

          【讨论】:

            猜你喜欢
            • 2015-11-13
            • 1970-01-01
            • 1970-01-01
            • 2018-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多