如何在Visual Studio中调试外部类库项目?

177

我有一个项目(A),它引用了来自另一个VS解决方案中的外部项目(B)类库的程序集。

我还没有理解如何在从项目A运行程序的同时有效地调试来自B的类库。是否需要在项目B中启用调试信息等内容,以便我可以在A中进行调试时进入其中?

9个回答

249

尝试禁用"Just My Code"(JMC)。

  • 工具 > 选项 > 调试
  • 取消选中 "启用Just My Code"

默认情况下,调试器会尝试将世界视图限制在仅包含在您的解决方案中的代码范围内。这通常很有帮助,但当您想要调试不在您的解决方案中的代码时(如你现在的情况),您需要禁用JMC才能看到它。否则,该代码将被视为外部代码并且基本上会被隐藏。

编辑

当代码出现问题时,请尝试以下操作。

  • 调试 > 窗口 > 模块
  • 查找您感兴趣的项目的DLL
  • 右键单击 > 加载符号 > 选择其他项目的.PDB路径

8
特定的复选框已经取消选中了。 但我注意到,它会进入外部库的一个方法,但当我尝试调用接口的一个方法时,它会跳过。 - Kostas Konstantinidis
1
“仅限我的代码”似乎没有任何区别(即使启用它,我也可以跳转到外部代码),但在调试器中找到模块会有所帮助。 - TheOperator
12
在这个文件夹中找不到匹配的符号文件。 - Christine
3
如果您没有所引用模块的 PDB 文件,可以使用 ReSharper 中的“使用 ReSharper 反编译器加载符号”选项,在 Debug/Windows/Modules 的右键菜单中反编译二进制文件。非常强大。 - emilast
2
@Christine 如果你遇到了“在此文件夹中找不到匹配的符号文件”的问题,那么请查看项目中的参考文献,将其删除,本地构建参考文献的源代码并引用输出的dll。通过本地构建得到的dll会自动捕获PDB文件。因此,为了调试目的,你可以暂时更改引用。 - Mike de Klerk
显示剩余4条评论

22
假设路径为:

项目A

C:\Projects\ProjectA

项目 B

C:\Projects\ProjectB

而ProjectB的dll位于

C:\Projects\ProjectB\bin\Debug\

要从ProjectA调试进入ProjectB,请按照以下步骤进行:

  1. B的dll与dll的.PDB复制到ProjectA的编译目录中。
  2. 现在调试ProjectA。当代码在调试过程中到达需要调用dll的方法或事件等部分时,请按F11进入dll的代码。

注意:不要忘记复制.PDB文件


15

这个问题困扰我很长时间,通常我会使用调试模式重新构建我的外部库,然后将.dll和.pdb文件复制到我的网站的bin目录下。这样可以让我进入库代码。


4
这8年里,你是否偶然找到了更好的解决方案? - Black_Rider

6
我同时运行两个Visual Studio实例——一个用来编译外部DLL,另一个用于主应用程序。
在外部DLL的项目属性中进行以下设置:
构建事件:
  • copy /y "$(TargetDir)$(TargetName).dll" "C:\<path-to-main> \bin\$(ConfigurationName)\$(TargetName).dll"

  • copy /y "$(TargetDir)$(TargetName).pdb" "C:\<path-to-main> \bin\$(ConfigurationName)\$(TargetName).pdb"

调试:
  • 启动外部程序:C:\<path-to-main>\bin\debug\<AppName>.exe

  • 工作目录 C:\<path-to-main>\bin\debug

这样,每次我编译外部DLL时,它都会更新到主应用程序目录中。如果我从外部DLL的项目运行调试,则主应用程序会运行,但调试器只会在外部DLL中断点处停止。如果我从主项目运行调试,则主应用程序将使用最近编译的外部DLL运行,但现在调试器只会在主项目中断点处停止。
我知道一个调试器可以完成两种任务,但我发现这样更容易分清二者。

3
如果你有一个主项目(项目A)和一个外部库(项目B):
1. 在Visual Studio中打开(项目A)的解决方案。 2. 右键单击“解决方案” -> “添加现有项目” -> 然后选择您外部库(项目B)的 .csproj 文件。 3. 再次在Visual Studio中右键单击(项目A)->“添加”->“项目引用...”-> 然后在您想要调试的外部库(项目B)上添加勾号。 4. 最后,在您调用外部库(项目B)的(项目A)中设置断点,然后按F5运行。

1

如果只需要一次性地完成此操作,最快的方法是在编辑和启动项目A的Visual Studio实例中直接打开Proj B文件(文件 => 打开 => 文件)。您不需要将该文件添加到解决方案中。只需在编辑器中打开它即可让您直接在Proj B文件中创建断点。


1

[根据发送给我的答案的Martin Beckett]

您可以调试外部库。

在项目设置选项卡中查找“Visual Studio目录”,在“源代码”字段中包括openCV源路径。然后确保每个调试dll的.pdb文件与dll位于同一目录中。


1

NuGet引用

假设有以下项目: - Project_A (生成 project_a.dll) - Project_B (生成 project_b.dll) 如果 Project_B 引用了 NuGet 包中的 Project_A,则只需将 project_a.dll 和 project_a.pdb 复制到 Project_B/Packages 文件夹。这样,文件就会被复制到 /bin 文件夹中。

现在调试 Project_A。在代码执行到需要调用 dll 的方法或事件等部分时,按 F11 键步入 dll 的代码。


0

我遇到了类似的问题,我的项目(B)中的断点没有被触发。我的解决方案是重新构建项目(B),然后调试项目(A),因为dll需要更新。

Visual Studio应该允许您调试外部库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接