如何在Visual Studio中设置引用代码的断点?

68

我的主要解决方案是使用我自己编写的实用程序类库中的代码,但它是另一个解决方案的一部分。我该如何在引用的DLL文件中设置断点?

8个回答

74

点击“调试(Debug)”,选择“新建断点(New Breakpoint)”,然后选择“在函数处中断(Break at Function)”,最后输入函数的全名。


2
由于它无法验证该函数,因此我无法在VS2012下使其工作。它似乎能够在解决方案中找到函数,但无法在引用的库中找到。 - Sam
8
现在对我来说很清楚了,但请记得在函数的完整命名空间中包括括号之外的部分。 - Phil Cooper
1
你需要PDB文件。幸运的是,即使你没有PDB文件,你也可以生成它。请参考:https://dev59.com/lXE85IYBdhLWcg3wx2j2#31286658。 - Ohad Schneider
1
如果我没记错的话,Namespace.ClassName.ClassName - SLaks
1
尝试使用 Ns.ClassName.ctor - SLaks
显示剩余3条评论

26

在Visual Studio中,使用菜单

文件 > 打开 > 文件…

手动打开包含所需方法的引用DLL的源文件,然后通过单击代码编辑器中的左边框来设置断点。这样可以在任何代码行上中断,而不仅仅是在函数调用处。Visual Studio显示断点处于已禁用状态,因为它认为该代码无法到达。只需忽略它; 一旦代码运行并加载了DLL,断点将变为活动状态。

注意:为使此功能正常工作,您必须引用程序集的Debug版本。


18
您可以执行以下操作之一:
  1. 将DLL项目添加到包含可执行文件的解决方案中。然后您可以像平常一样设置断点。
  2. 或者您可以直接打开DLL项目并使用“调试”->“附加到进程”来附加到正在运行的EXE。

16
我觉得很容易 - 只需要并排运行两个 Studio 实例即可。在“主”实例上按 Ctrl-F5 以不附加调试器的方式启动,然后附加到正在编辑库项目的 Studio 实例的进程。 - Frep D-Oronge
2
Frep D-Oronge,你应该将这作为一个答案添加进去 - 这似乎是最简单的整体方法。 - Tim MB
@FrepD-Oronge 希望我能在2小时39分钟前看到你的评论。你太棒了!这绝对是最简单的解决方案。 - Nova

8

我知道这是一个老问题,但可能对很多人有帮助。

为了使调试器正常工作,您需要加载调试符号数据库,一个与要调试的程序集同名的 .pdb 文件。如果它是您创建的解决方案的一部分,您可以从其他解决方案的 bin 文件夹中复制粘贴它。然后添加断点,指定您想要调试的方法的完整路径,以及它所在的程序集的名称。例如:"MyNamespace.MayClass.MyMethod, MyAssemblyName"

如果您不拥有代码,有两个选项,都涉及反汇编器。我使用 dotPeek 进行此操作,因为它真的非常好用。

选项 1:使用 dotPeek 打开程序集并为其创建单个 .pdb 文件,然后将其复制到您的 .bin 文件夹并按照上述步骤进行操作。https://www.jetbrains.com/decompiler/help/Generating_PDB_Files.html

选项2:使用dotPeek符号服务器和PDB生成。 https://www.jetbrains.com/decompiler/help/Symbol_Server_and_PDB_Generation.html 之后按照上面的说明附加调试器实例即可。
希望这可以帮助你。

哇,dotPeek的PDB生成功能真是太棒了。 - Ohad Schneider
还有一种工具可以直接从符号服务器(默认配置为官方MS符号服务器[http://msdl.microsoft.com/download/symbols])获取PDB: https://github.com/rajkumar-rangaraj/PDB-Downloader。 - Ohad Schneider
https://www.jetbrains.com/decompiler/help/Symbol_Server_and_PDB_Generation.html 链接已损坏。 - David Klempfner

6
请按照以下步骤操作:
  1. 进入 Debug
  2. 选择 New Breakpoint
  3. 点击 Function Breakpoint,或直接按下键盘上的 Ctrl+K, B
  4. 会弹出一个窗口,在窗口中输入函数名称,格式如下:

命名空间.类名.函数名

例如,假设您有这样一段代码,我想在函数 D 开始处设置断点:

namespace A.B{
    public class C{
          public void D(){
               int x= 10;
          }
    }
}

在“功能断点”窗口中,您需要输入:A::B::C::D

1
泛型类型和带参数的方法的格式是什么? - Jesse

5
确保您在引用的类库dll所在的bin/debug文件夹中拥有.pdb文件。当您调试当前解决方案时,您应该能够从您的类库代码中步入代码。当您步入类库时,您将能够设置断点。

0

这不是我的答案,而是Frep D-Oronge在上面的评论中提出的建议。它很容易操作,没有任何问题:

“我发现很容易 - 只需同时运行两个Studio实例。在“主”实例上按Ctrl-F5以启动不带调试器的程序,然后使用正在编辑库项目的Studio实例附加到该进程”

所有功劳归于他。


-1

假设您想要调试位于NuGet包中的SomeMethod

在这种情况下,更简单的方法是:

  1. 在您自己的代码/测试文件中的任何位置键入MyClass.SomeMethod
  2. 按住Ctrl并单击“SomeMethod”,Visual Studio将打开“MyClass.cs”
  3. 添加断点
  4. 返回到您的代码并删除步骤1中键入的MyClass.SomeMethod
  5. 单击“调试”

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