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

Uco*_*dia 69 debugging process visual-studio

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

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

当然Thread.Sleep(1000)在我的启动事件中添加一个让我有时间在Visual Studio中附加进程是不可能的!

Tib*_*ibi 86

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

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

在此输入图像描述

确保"附加"设置为"否".

  • 很好的解决方案,但请注意,在这种情况下,击中F5不起作用.而是右键单击相关项目,然后从上下文菜单中单击"调试>启动新实例". (4认同)
  • 谢谢你的伎俩!它完美地运作. (2认同)
  • 为了使 F5 工作,您的项目必须是解决方案中的启动项目。为此,在解决方案资源管理器中右键单击项目并选择“设置为启动项目”。 (2认同)

mst*_*nge 20

我在外部生成的进程中调试了一个C++插件,它在启动时抛出异常而崩溃,这对我很有用:

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

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

  • 对我不起作用。在崩溃已经发生之后,它仍然连接得太晚了。它似乎每秒检查一次现有进程,这对于这个应用程序来说是完全没有意义的。 (2认同)

Mat*_*mas 16

如果您有Visual Studio 2017,请按照下列步骤操作:

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

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

  • @Eric如果[我的上述评论](/sf/ask/571732731/ ?noredirect = 1#comment77311482_45171720)没有解决问题,因此我建议将其作为SO问题而不是评论。您的问题将获得更大的知名度,您将有机会解释您的具体情况。然后,让我们知道您的发现! (2认同)
  • @StayOnTarget 您应该能够在“打开项目/解决方案”对话框窗口中选择 .exe。您会注意到对话框窗口的“所有项目文件”文件过滤器(默认过滤器)包括 *.exe (2认同)

Hau*_* P. 9

当我寻找类似的东西时,我找到了这个答案.在我的情况下,我不能简单地使用可执行文件作为我的项目的启动程序,因为它需要在一个我无法轻易复制的非常特定的环境中启动(namly:从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.如果找不到要调试的应用程序:
    a.右键单击" 图像文件执行选项"文件夹,然后在快捷菜单上单击" 新建密钥".
    湾 右键单击新密钥,然后在快捷菜单上单击" 重命名".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将启动并加载应用程序.

希望这对未来的其他人有所帮助!

  • 以下是使用较新版本的 VS(截至 2019 年)的相同流程的说明:https://docs.microsoft.com/en-us/visualstudio/debugger/debug-multiple-processes?view=vs-2019#BKMK_Automatically_start_an_process_in_the_debugger (4认同)

小智 6

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

MessageBox.Show("Attach process to debugger and click ok!");
Run Code Online (Sandbox Code Playgroud)

您可以将其添加到 Form 构造函数中(如果您使用 winforms),因此这将在其他任何事情之前执行,除了组件的初始化之外:

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

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


Som*_*ody 5

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

public static void Main(string[] args)
{
  System.Diagnostics.Debugger.Launch();
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 对于您等待某些外部进程启动应用程序的所有情况,这应该是可接受的答案。 (3认同)