【问题标题】:Visual Studio 2015 Debugging Custom ControlVisual Studio 2015 调试自定义控件
【发布时间】:2016-06-30 00:52:20
【问题描述】:

我将自定义控件编译为使用 Visual Studio 2012 开发的 DLL,并顺利部署到生产环境中。这些控件在应用程序加载时使用反射加载为“插件”。

当我使用 Visual Studio 2015 打开解决方案并尝试设置断点时,断点表明符号已加载,但在命中该部分代码时它永远不会中断。

在 Visual Studio 2012 中,这些断点会正确中断。我曾尝试在 Visual Studio 2015 中重新编译 DLL,但它们仍然不会中断。所有 PDB 也都带有 DLL。关于是什么原因的任何想法?

我已经检查了 VS 中的所有调试设置,并卸载/重新安装了 VS,但仍然遇到同样的问题。

【问题讨论】:

  • 逻辑是否真的会命中那部分代码(我之前被这个抓住了)?
  • 确实如此,我在InitializeComponent()方法的控制权的初始化器中添加了断点。
  • 您的所有组件/项目是否都使用相同的 .NET 目标版本?也许您的控件是针对 .NET 2.0 运行时(即 .NET 3.5 和更早版本)编译的,而您的主应用程序项目是针对 .NET 4.0 或更高版本编译的。如果是这种情况,则不会命中 .NET 2.0 部分中的断点,因为托管调试器仅附加到 4.0 运行时。

标签: c# debugging visual-studio-2015


【解决方案1】:

确保为 DLL 项目禁用优化,PDB 生成不是无,并且构建路径与其他项目使用 DLL 的位置相同。 很多时候,只需清理整个解决方案,删除 Obj 文件夹 PDBs/dlls 并重建即可解决问题。

【讨论】:

    【解决方案2】:

    调试 DLL 的方法

    本节中的每个项目都会创建一个 DLL。您不能直接运行 DLL;它必须由应用程序调用,通常是 EXE。有关详细信息,请参阅创建和管理 Visual C++ 项目。调用应用程序可能符合以下任一条件: 在包含类库的同一 Visual Studio 解决方案中的另一个项目中构建的应用程序。 已部署在测试或生产计算机上的现有应用程序。 位于 Web 上并通过 URL 访问。 包含嵌入 DLL 的网页的 Web 应用程序。


    调试调用应用程序

    要调试 DLL,首先要调试调用应用程序,通常是 EXE 或 Web 应用程序。有几种方法可以调试它。 如果您有调用应用程序的项目,则可以打开该项目并从“调试”菜单开始执行。有关详细信息,请参阅 b0fe0ce5-900e-421f-a4c6-aa44ddae453c。 如果调用应用程序是已经部署在测试或生产计算机上并且已经在运行的现有程序,您可以附加到它。如果 DLL 是 Internet Explorer 承载的控件或网页上的控件,请使用此方法。有关详细信息,请参阅 636d0a52-4bfd-48d2-89ad-d7b9ca4dc4f4。 您可以从 DLL 项目中对其进行调试。有关详细信息,请参阅如何:从 DLL 项目进行调试。 您可以从 Visual Studio 即时窗口对其进行调试。在这种情况下,立即窗口扮演应用程序的角色。 在开始调试调用应用程序之前,通常需要在类库中设置断点。有关详细信息,请参阅 fe4eedc1-71aa-4928-962f-0912c334d583。当断点被命中时,你可以单步执行代码,观察每一行的动作,直到你找出问题所在。有关详细信息,请参阅 8791dac9-64d1-4bb9-b59e-8d59af1833f9。


    网页上的控件

    若要调试网页控件,请创建一个嵌入它的 ASP.NET 页面(如果这样的页面尚不存在)。然后在网页代码和控制代码中放置断点。然后从 Visual Studio 调用网页。 在开始调试调用应用程序之前,您通常需要在 DLL 中设置断点。当断点被命中时,你可以单步执行代码,观察每一行的动作,直到你找出问题所在。有关详细信息,请参阅 FE4EEDC1-71AA-4928-962F-0912C334D583。


    即时窗口

    您可以在没有调用应用程序的情况下评估 DLL 中的函数或方法。您进行设计时调试并使用“立即”窗口。要以这种方式进行调试,请在 DLL 项目打开时执行以下步骤: 打开调试器立即窗口。 要在 Class1 类中测试名为 Test 的方法,请通过在“立即”窗口中键入以下 C# 代码来实例化 Class1 类型的对象。此托管代码适用于 Visual Basic 和 C++,并进行了适当的语法更改:

    Class1 obj = new Class1();
    

    在 C# 中,所有名称都必须是完全限定的。此外,任何方法或变量都必须在调试会话的当前范围和上下文中。 假设 Test 采用一个 int 参数,使用即时窗口评估 Test:

    ?obj.Test(10)
    

    结果将打印在立即窗口中。 您可以通过在其中放置断点然后再次评估该函数来继续调试 Test:

    ?obj.Test(10);
    

    断点将被命中,您将能够单步执行测试。执行离开测试后,调试器将返回设计模式。

    欲了解更多信息,请访问Debugging DLL Projects。希望这会有所帮助...

    【讨论】:

    • 奇怪的是,我可以在调用应用程序初始化控件之前和之后中断调用应用程序,但 DLL 中的任何内容都不会中断。 PBD 显示它们已加载且代码未优化。
    【解决方案3】:

    1) 尝试添加此标签

    在配置文件的 标记内。

    2) 清理您的解决方案。

    3) 在解决方案 > 属性 > 项目依赖项 > 选中“DLL”项目中的复选框并将“exe”项目保留为启动项目。

    4) 构建解决方案,如果 dll 在不同的项目中,请先构建该项目,然后构建“.exe”。

    5) 如果这不起作用,请尝试为您的解决方案设置不同的 .net 框架(以清理配置文件),然后设置原始 .net 框架,最后尝试步骤 1、2、3 和 4再次。

    【讨论】:

      【解决方案4】:

      可能是符号没有被加载。

      当你加入你的程序并且你确定你的 “插件”已加载 选择调试 -> Windows -> 模块。

      在列表中找到您的 dll 并查看“符号状态”列。它可能显示“找不到或打开 PDB 文件”或“未加载符号”。

      通常右键单击并选择“加载符号”可以解决此问题。

      它会自动加载文件或要求您手动查找 pdb。

      【讨论】:

      • 在“模块”窗口下查看时,模块显示符号已加载,并且 DLL 未优化。
      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 2016-03-26
      • 2015-11-15
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多