Windows COM - 如何调试 COM 服务器

Posted

技术标签:

【中文标题】Windows COM - 如何调试 COM 服务器【英文标题】:Windows COM - how to debug a COM server 【发布时间】:2011-08-12 20:06:19 【问题描述】:

我有一个进程耗尽的 com 服务器(用 C++、ATL 编写)。在我的一台计算机上,我只需在调试器下启动 COM、设置断点并从客户端进程连接到服务器,就可以轻松调试服务器代码。

在我的另一台计算机上不会发生这种情况,如果我从一开始就在调试器下启动 COM 服务器,客户端使用同一服务器的另一个实例,调试服务器的唯一方法是在客户端已经连接到它之后开始了。如何配置?

【问题讨论】:

那台机器上可能安装了另一个版本的 COM 服务器?尝试在系统注册表中搜索 COM 服务器,如果发生了,请卸载另一台。 您是否尝试过让 COM 通过生成错误来调用调试器。例如 Assert(0) 当它遇到错误时,它会询问您是否要开始调试。 【参考方案1】:

问题在于,在 Vista 及更高版本下,当您启动提升的 com 服务器(以便注册表部分在构建结束时进入注册表)时,COM 客户端将启动另一个 COM 服务器实例(同时他的诚信水平,例如中等和不高)

所以我必须以普通用户(而不是以管理员身份运行)为服务器运行 Visual Studio,并且必须从命令行进行 COM 注册。

【讨论】:

感谢您的信息!我实际上并没有尝试调试我的进程外服务器的初始化,但我不明白为什么另一个进程实例不断弹出,因为 ATL 应该已注册该类以供多用。【参考方案2】:

正常启动您的流程。使调试器在 COM 客户端的断点处停止。启动另一个 Visual Studio 实例(我假设您正在运行 Visual Studio),并附加到 out of proc 服务器进程。在 Visual Studio 2008 中,您可以通过在 Tools 菜单中选择 Attach to process... 来完成此操作。然后只需选择要调试的进程,就可以了。您可能需要手动打开源代码文件来设置断点,因为您没有在原始项目的上下文中进行调试。

【讨论】:

这正是我想要避免的。我希望能够直接从调试器启动我的服务器,否则当我能够连接到已经启动的服务器时,我会错过服务器中的一些“初始化”步骤

以上是关于Windows COM - 如何调试 COM 服务器的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 7 上安装调试工具以分析小型转储

如何在 Windows 上构建/调试(完整)LibTorch 源?

如何跟踪和调试Windows服务

windows虚拟机怎么打断点调试

如何在调试模式下运行 wildfly,作为 Windows 上的服务?

如何在Visual Studio中调试Windows服务?