如何将Visual Studio附加到尚未启动的进程?


89

我有无法由于某些原因(从Excel 2010模板项目创建的Excel文件)而无法从Visual Studio运行的.NET程序,因此需要调试启动事件。

如果我要调试程序初始化后发生的事件,那没有问题。我从资源管理器运行该程序,将该过程附加到Visual Studio,并在代码中添加一些断点。但是在这里,我需要在启动事件上设置断点。我需要能够将流程附加到Visual Studio,而不是取决于PID,而是取决于特定的流程名称或任何其他可行的解决方案。

当然,Thread.Sleep(1000)在启动事件中添加a可以给我一些时间在Visual Studio中附加该过程,这是不可能的!

Answers:


97

其实你可以;您没有依附它,而是启动它。在项目的属性的“调试”选项卡上,在“命令”文本框中指定要附加的程序的路径。

您也可以在“命令参数”框中输入程序的任何命令行参数:

在此处输入图片说明

确保将“附加”设置为“否”。


6
好的解决方案,但请注意,在这种情况下,按F5键不起作用。而是右键单击相关项目,然后从上下文菜单中单击“调试>启动新实例”。
赫尔曼·科德斯

1
为了使F5正常工作,您的项目必须是解决方案中的“开始项目”。为此,在解决方案资源管理器中,右键单击该项目,然后选择“设置为启动项目”。
Tibi

1
另外,如果您的程序具有某些外部依赖性,则还需要更改“工作目录”。
Priyank

可能需要检查“启用本机代码调试”(项目属性→调试启用调试器)。
彼得·莫滕森

您如何在40个项目的整个解决方案中做到这一点?
Tony Tannous

23

我正在外部生成的进程中调试C ++插件,该进程在启动时抛出异常而崩溃,这对我来说非常理想:

添加免费的Visual Studio重新附加扩展。在启动之前,要求它重新附加到进程名称。它将弹出一个模态对话框,说明正在等待进程名称启动。

现在启动该过程,Visual Studio调试器将立即连接,捕获异常并达到断点。


一千次是!
itslittlejohn 2015年

我陷入僵局。当我的目标启动时,它要求管理员身份验证,并且在键入pwd并重新启动vs之后,重新连接已消失。只有vs没有管理员身份验证才包含重新连接。
埃里克

2
对我不起作用。坠毁已经发生后,它仍然为时已晚。似乎每秒检查一次现有过程,这对于此应用程序完全没有意义。
riv

20

如果您拥有Visual Studio 2017-2019,请按照以下步骤操作:

  1. 文件>打开>项目/解决方案
  2. 选择您的.exe
  3. 调试>开始调试

比其他建议容易得多:您不必弄乱项目属性,也不需要扩展。


但是您必须告诉Visual Studio调试符号在哪里,如果它不能自动找到它们的话
Matt Thomas

1
快速轻松就能在5秒内完成操作,我喜欢它。感谢
同志Joecool '17

1
我的exe已启动,但无法设置断点。我该怎么办?
艾里克

2
@Eric如果上面的评论没有解决,那么我建议将其作为SO问题而不是评论。您的问题将获得更大的知名度,您将有机会解释您的具体情况。然后让我们知道您找到了什么!
马特·托马斯

11

当我寻找类似的东西时,我找到了这个答案。就我而言,我不能简单地将可执行文件用作项目的启动程序,因为它需要在无法轻松复制的非常特定的环境中启动(命名为:从cygwin开始)。

我看了mrstrange建议的Reattach扩展,以及非常相似的Attach To Anything扩展...,但是我的可执行文件似乎关闭得太快,扩展无法通知和附加。

最终帮助我的是:https : //stackoverflow.com/a/4042545/1560865,其中引用了MSDN文章“如何:自动启动调试器”,而该清单又列出了以下步骤:

  1. 启动注册表编辑器(regedit)。
  2. 在注册表编辑器中,打开HKEY_LOCAL_MACHINE文件夹。
  3. 导航到HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ image文件执行选项。
  4. 在“图像文件执行选项”文件夹中,找到要调试的应用程序的名称,例如myapp.exe。如果你不能找到应用程序要调试:
    一。右键单击“图像文件执行选项”文件夹,然后在快捷菜单上单击“新建密钥”
    b。右键单击新密钥,然后在快捷菜单上单击重命名。C。将密钥名称编辑为您的应用程序名称;在此示例中,为myapp.exe
  5. 右键单击myapp.exe文件夹,然后在快捷菜单上单击新建字符串值
  6. 右键单击新的字符串值,然后在快捷菜单上单击“重命名”。
  7. 将名称更改为debugger
  8. 右键单击新的字符串值,然后在快捷菜单上单击“修改”。出现“编辑字符串”对话框。
  9. 在“数值数据”框中,键入vsjitdebugger.exe
  10. 单击确定
  11. 注册表菜单中,单击退出
  12. 包含vsjitdebugger.exe的目录必须位于您的系统路径中。将它添加到系统路径,请按照下列步骤操作:
    一。在“经典”视图中打开“控制面板”,然后双击“系统”
    b。单击高级系统设置
    C。在“系统属性”中,单击“高级”选项卡。
    d。在“高级”选项卡上,单击“环境变量”
    e。在“环境变量”对话框的“系统变量”下,选择“路径”,然后单击“编辑”按钮。
    F。在编辑系统变量中对话框,将目录添加到变量值框。使用分号将其与列表中的其他条目分开。
    G。单击“确定”关闭“编辑系统变量”对话框。
    H。单击“确定”关闭“环境变量”对话框。
    一世。单击“确定”关闭“系统属性”对话框。
  13. 现在,使用任何方法来启动您的应用程序。Visual Studio将启动并加载应用程序。

希望这对以后的任何人有帮助!


3
以下是使用更新版本的VS(至2019年)的相同过程的说明:docs.microsoft.com/en-us/visualstudio/debugger/…–
brichins

3

如果没有任何进程,则Visual Studio无法附加到该进程。

但是,您可以将项目的启动程序设置为项目输出以外的内容。


我已经调查过我想做的事是否正确,实际上是正确的。我的情况不是通常的Visual Studio调试情况。我有一个用Visual Studio开发的Excel 2010模板项目,并且模板表有启动事件。我从Visual Studio运行此模板,在Excel工作表中添加一些数据,然后将文件保存在磁盘上。然后,我可以打开也依赖于模板程序集的此文件的唯一方法是从资源管理器中打开它,因此在这种情况下,我无法调试启动事件,当然,启动时我会进行一些数据处理,例如数据绑定。
Ucodia

可能需要检查“启用本机代码调试”(项目属性→调试启用调试器)。
彼得·莫滕森

3

您可以显示一个MessageBox,这将阻止应用程序,然后将调试器附加或重新附加到该进程,然后单击“确定”继续:

MessageBox.Show("Attach process to debugger and click ok!");

您可以将其添加到Form构造函数中(如果使用winforms),因此除组件初始化外,该过程将首先执行:

public MainForm()
{
    InitializeComponent();
    MessageBox.Show("Attach process to debugger and click ok!");
}

完成调试后,请注释掉该行。


3

您可以通过以下方式从代码中启动调试器

public static void Main(string[] args)
{
  System.Diagnostics.Debugger.Launch();
}

但是,不要在运输您的应用程序之前删除此行。也许您想使用编译器标志来确保:

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }

2
对于所有等待外部程序启动应用程序的情况,这应该是可接受的答案。
TravelingFox

2

一种可能适合许多人的小解决方案。

  • 在exe将运行的第一行代码中,添加此命令

    System.Threading.Thread.Sleep(20000)

这将使exe睡眠20秒,然后开始处理任何内容。然后,您有20秒的时间附加到该过程,可以使用ctrl + alt + p快速完成该过程,然后找到该过程,然后输入要附加。

没有太多的答案,但是为我工作了:-)


我必须调试一个用“ C”编写的CGI,并为其提供了源代码。我是一个简单而容易的解决方案,可以花时间附加到后台进程。
乔尔赫克特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.