调试器无法附加到进程

8

我有一个MMC插件需要进行调试。目前,以下代码放在插件的构造函数中,可以成功地将调试器附加到它上面:

public MySnapIn()
{
#if DEBUG
    if (!Debugger.IsAttached)
    {
        Debugger.Launch();
    }
#endif
    ...
}

但是每次都必须将调试器附加到Visual Studio真的很烦人。我想自动化这个过程。理想情况下,我只需要按F5,它就会自动附加调试器。我已经尝试了以下方法:
  • 项目属性 -> 启动外部程序 -> 输入“C:\ Windows \ System32 \ mmc.exe”
  • 项目属性 -> 命令行参数 -> 给了一个.msc文件的路径(存储快照布局,使每次加载变得更容易,因此您不必总是File->添加/删除快照)。
这并没有起作用。调试器无法自动附加。如何自动化此过程,或者是什么阻止调试器自动附加?

3
+1 是因为你教会了我如何请求调试器附加 (Debugger.Launch()). 我不知道这是可能的。 - stakx - no longer contributing
1
@stakx 它 大多数时间 是有效的。例如,如果您有一个Windows服务或其他类型的应用程序,根据soft micro的说法,它不应该有GUI,则无法正常工作:https://dev59.com/qGfWa4cB1Zd3GeqPhXut 您可能还想了解WER作为调试工具(为您生成崩溃转储;使用崩溃转储,您可以将它们加载到Visual Studio中,并在失败点重新挂钩调试器并查看所有应用程序对象的状态)。 - Alexandru
@stakx,WER只需要更改注册表键(http://msdn.microsoft.com/en-us/library/windows/desktop/bb787181(v=vs.85).aspx)和存在PDB文件。您还可以从任务管理器生成转储(CTRL + SHIFT + ESC->右键单击应用程序->生成转储文件)。 - Alexandru
WER听起来很有趣。但由于目标机器上缺乏管理员权限,我将无法在希望使用它的工作中使用它,但无论如何我会研究一下它。 - stakx - no longer contributing
1
@stakx 同时,有时候,如果你正在使用 C++(本机)和 C#(托管)应用程序,在附加调试器(调试->附加到进程)时,您可能需要更改它的附加方式。 "附加到:"有一个选择...按钮,我不得不启用所有这3个:本机、托管和托管兼容模式,以便调试一些在运行时加载/调用托管 DLL 的本机应用程序,以便能够调试它。Windows 中的调试支持非常出色,但文档总是如此糟糕... - Alexandru
1个回答

6

刚拿到了这个。事实证明, 你必须在64位系统上使用32位MMC启动器,然后在“命令行参数”中添加-32标志,以强制它保持在32位模式下

  • 确保我的插件项目在配置管理器中针对任何CPU。
  • 项目属性 -> 启动外部程序 -> 输入"C:\ Windows\ SysWOW64\ mmc.exe"
  • 项目属性 -> 命令行参数 -> 给它一个.msc文件的路径,还有-32标志(存储插件布局,使每次加载更容易,这样您就不必总是文件 -> 添加/删除插件)。

3
"C:\Windows\SysWOW64\mmc.exe"虽然名称中带有64,但该文件夹实际上是32位程序的存放位置,因此你正在运行32位启动器而不是64位。64位版本存储在C:\Windows\System32,如果你正在运行64位应用程序,或者在运行32位应用程序时存储在C:\Windows\sysnative(如果你正在运行32位应用程序,System32将重定向到SysWOW64)。 - Scott Chamberlain
@ScottChamberlain 这太反直觉了,但谢谢,我会更新我的答案。 - Alexandru
1
如果您想了解更多关于这种重定向的信息,请参阅MSDN页面上的“文件系统重定向”(http://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85).aspx)。 - Scott Chamberlain
如果有其他人关心的话,WoW64应该是“Windows 32位于Windows 64位”的缩写:http://en.wikipedia.org/wiki/WoW64 - Alexandru

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