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

时间:2011-11-17 13:09:41

标签: visual-studio debugging process

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

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

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

8 个答案:

答案 0 :(得分:81)

其实你可以;你没有附上它,你就开始了。在项目的属性上,在“调试”选项卡上,在“命令”文本框中指定要附加到的程序的路径。

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

enter image description here

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

答案 1 :(得分:18)

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

添加免费Reattach Extension for Visual Studio。要求它在启动之前重新连接到进程名称。它会弹出一个模态对话框,说它正在等待进程名称启动。

现在启动该进程,Visual Studio调试器将立即附加,捕获异常并命中断点。

答案 2 :(得分:10)

如果您有Visual Studio 2017,请执行以下步骤:

  1. 文件>打开>项目/解决方案
  2. 选择您的.exe
  3. 调试>开始调试
  4. 比其他建议容易得多:您不必弄乱项目属性,也不需要扩展。

答案 3 :(得分:8)

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

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

最终帮助我的是:https://stackoverflow.com/a/4042545/1560865,它引用了MSDN文章How to: Launch the Debugger Automatically,后者又列出了以下步骤:

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

答案 4 :(得分:3)

如果没有进程,则Visual Studio无法附加

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

答案 5 :(得分:3)

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

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

但是,请勿在发送应用程序之前删除此行。也许您想使用编译器标志来确保:

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

答案 6 :(得分:1)

一个可能适合很多人的小解决方案。

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

    System.Threading.Thread.Sleep(20000)

这将使exe在开始处理任何内容之前休眠20秒。然后你有20秒的时间来附加到进程,可以使用ctrl + alt + p快速完成,然后找到进程,然后输入attach。

答案不多,但对我来说是一种享受: - )

答案 7 :(得分:1)

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

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

你可以将它添加到Form构造函数中(如果你使用winforms),所以这将在其他任何东西之前执行,除了组件的初始化:

select distinct year, f3.NB                               
from tmpxx f1                                             
left outer join lateral                                   
(                                                         
  select count(*) NB from tmpxx f2                        
  where f1.year is null and f2.year is null or            
        f1.year>=f2.year                                  
) f3 on 1=1            

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