【问题标题】:Debugging COM executable调试 COM 可执行文件
【发布时间】:2017-05-12 23:54:58
【问题描述】:

我正在使用 VS 2010 的 Visual C++ 开发可执行 COM 对象。现在我需要对其进行调试。但是在哪里传递使用这个 COM 的应用程序呢? 如果我将它放入Conf. properties>>Debugging>>Command,应用程序会启动,但不会通过 COM 代码中的断点。

更新:

我的项目是进程外 COM 服务器。

我已经测试了debugging types - Native OnlyAuto 以及两种调试模式 - run and + client applicationsrun client application and attach to process from VS COM project。在这些情况下,我都没有成功调试。调试断点未激活。我已经从 cmd 提示符 myCom.exe /RegServr 运行,但他没有帮助。如何解决这个问题?

UPD2:

我发现,如果我从另一个 IDE 运行使用我的 COM 服务器的客户端应用程序,我当前的带有 COM 项目的 IDE 会开始看到断点并通过它们。如何实现这种行为?为什么 COM 项目中的断点在将客户端应用程序作为普通应用程序运行时不活动?

【问题讨论】:

  • “可执行 COM 对象”是指进程外 COM 服务器(也称为本地服务器)吗?或者它只是一个 DLL(进程内服务器)?前者我没有经验,但后者你只需调试使用 DLL 的应用程序。
  • 而如果是进程外服务器,则在调试器下启动,然后单独运行应用程序
  • 我已经用更多信息更新了问题正文
  • @M.M 您应该通过将“/embedding”作为命令行传递来启动本地服务器调试会话。这指示服务器注册自己并等待 CreateInstance 调用。
  • /embedding 可能只用于 COM 项目?

标签: visual-studio-2010 visual-c++ com


【解决方案1】:

可能您已经完成了以下部分或全部操作,但在许多情况下,此类问题困扰着我们,因为我们看不到最明显的问题..

确保可执行文件加载实现 com 对象的正确版本的 dll。 “正确”版本是您当前构建的版本和(或更准确地说是您为其创建了 pdb 文件的 dll 版本)。

确保您设置调试命令的项目的调试器类型设置为“仅本机”(默认为“自动”)。

如果附加到可执行进程,请确保“附加到”多选列表至少包含“本机代码”。

【讨论】:

  • 我所有的组合,但这没有帮助。我已经用 cmets 更新了问题正文。
  • COM dll 构建是否启用了调试信息(项目属性中的 C/C++ 选项卡和为条目“调试信息格式”定义的“程序数据库”?COM dll 的相应 pdb 文件是否存在于COM dll 的同一个文件夹?
  • 在运行可执行文件时显示 Debug\Windows\Modules 窗口并找到 COM dll 行。是否加载了符号文件?如果没有,请尝试通过右键单击该行并选择 Load Symbols From\Symbol Path 自行找到它。
  • 在我的 VS2010 中,我只有 Debug>>Windows>>Breakpoints/Output/Immediate,没有模块。
  • 我只有 C/C++>>General>>Debug Information Format 并且设置为 Programm Database for Edit And Continue (/ZI)
【解决方案2】:
  1. 启动使用您开发的 COM 对象的应用程序。
  2. 使用 VS,调试/附加到进程。
  3. 在 COM 对象源代码中设置适当的断点。

编辑

如果调试断点未激活,则通常意味着来源可能与 COM 对象的来源不同。尝试做一个干净的项目并重建所有。 确保正确的 COM 服务器已加载并注册,即 Debug 目录中的那个。您可以使用 sysinternals 中的 procexp 看到这一点,它显示了为您的测试应用程序加载的 dll。 -- https://technet.microsoft.com/en-us/sysinternals/processexplorer.aspx

另外一个可能出错的地方是您没有注册 .DLL/.EXE 的 Debug 版本,在这种情况下,请确保您注册了正确的版本。

【讨论】:

  • 我试过这个,但这没有帮助。我已经用 cmets 更新了问题正文。
  • 当我从 IDE 运行客户端应用程序时,我可以通过断点。为什么? UPD2 中的更多详细信息
  • @vico 无论您是从 VS 附加到客户端应用程序还是从 VS 内运行客户端应用程序,只要客户端 exe 在这两种情况下都处于调试模式并且使用相同的 COM,它都应该以相同的方式工作exe 在这两种情况下都已注册和使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多