1

我正在为应用程序开发一个带有一些插件逻辑的 DLL(在 Visual C# Express 中)。

有没有办法调试这个DLL,一旦它被应用程序使用?该应用程序在 Windows 上作为服务运行,它是一个 COTS 应用程序,这意味着它不是我可以开始调试的 C# 项目。

我知道在 Visual C# Express 中进行调试存在一些限制。在 Visual Studio Pro 中是否可以执行此任务?

我想要实现的是能够单步执行逻辑,设置断点以查看来电时会发生什么。有什么线索吗?

4

3 回答 3

3

我不确定 VS Express,但通常情况下,

  1. 打开 Visual Studio
  2. 打开您的解决方案(Windows 服务项目)
  3. 调试 -> 附加到进程
  4. 从可用进程列表中选择您的服务
  5. 您可以使用断点和其他东西。

希望能帮助到你。

于 2012-06-27T20:47:10.097 回答
1

虽然我不完全确定这具体是如何与服务一起工作的,但您可以设置任意调试目标。

在调试面板中(在项目属性中),您可以将任何可执行文件或其他命令设置为调试目标。此命令生成的进程将附加调试器,无论可执行文件来自何处。不要求目标是 C# 项目或任何 Visual Studio 项目。这应该在 Express 和 Pro 中都可用。可以附加到稍后的进程(如果您有启动器),但这可能超出了您当前的范围。

然后像往常一样在代码中设置断点,当代码被命中时(无论您的代码调用它还是主机可执行文件),都会触发断点。根据您掌握的有关主机的信息量,您也可以有效地对其进行调试;即使您没有任何信息,您也可以逐步完成程序集。

这里唯一的要求是目标加载并运行您的代码。根据上下文(程序的插件、注入的依赖项等),这具有不同的难度。该技术用于许多地方,特别是插件系统,您可能无法调试实际主机,但仍希望使用插件进行调试。

另一个稍微丑陋的变体是强迫宿主打破和自我认同。这仅对调试有用,因为它非常具有破坏性。典型的方法是显示带有进程 ID 的消息框(模式)。然后该过程将暂停,直到消息被解除,并且可以附加调试器。这对于服务来说变得更加困难,尽管仍有一些方法可以以阻止方式发布您的信息。

于 2012-06-27T20:51:05.393 回答
1

您可以使用System.Diagnostics.Debugger.Break()方法。

于 2012-06-27T20:58:16.077 回答