Visual Studio:当进程启动时,自动附加到进程

90

我想在进程(a.exe)生成时立即附加,使用VS能做到吗?我只知道进程的名称。实际上,我想要实现的是在C#代码中设置断点,但该代码属于另一个可执行文件,该可执行文件将由当前运行的应用程序(c.exe)启动。 该代码位于初始化期间,因此我无法手动附加。


你能给我们更多的上下文吗?这个进程是你自己的吗 - 是你的代码吗?那个进程是否在调用你的代码? - Jaco Pretorius
这个回答解决了你的问题吗?如何将Visual Studio附加到尚未启动的进程? - StayOnTarget
10个回答

89

当我之前遇到过这种情况(并且我控制着两个进程时),我发现一个不错的解决方法是在生成进程的入口点中放置对Debugger.Launch()的调用。然后VS将弹出一个对话框,让你附加到该进程。


对我来说,我还必须将权限添加到我的用户以访问本地安全策略:请参见 https://dev59.com/DGLVa4cB1Zd3GeqP0-xb#10277353。 - andrew

36
请参阅MSDN文章如何自动启动调试器 - 这将允许您跳过繁琐的点击确认对话框的步骤[而不关闭UAC或其他操作]。该文章列出了以下步骤:
  1. 启动注册表编辑器(regedit)。
  2. 在注册表编辑器中,打开 HKEY_LOCAL_MACHINE 文件夹。
  3. 导航到 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  4. Image File Execution Options文件夹中,找到您想要调试的应用程序的名称,例如myapp.exe。如果您找不到要调试的应用程序:
    a. 右键单击Image File Execution Options文件夹,在快捷菜单上单击New Key
    b. 右键单击新建的键,在快捷菜单上单击Rename。 c. 编辑键名为您的应用程序名称;在此示例中为myapp.exe
  5. 右键单击myapp.exe文件夹,在快捷菜单上单击New String Value
  6. 右键单击新字符串值,在快捷菜单上单击Rename
  7. 将名称更改为debugger。
  8. 右键单击新字符串值,在快捷菜单上单击Modify。出现Edit String对话框。
  9. Value data框中,键入vsjitdebugger.exe
  10. 单击OK
  11. Registry菜单中,单击Exit
  12. 包含vsjitdebugger.exe的目录必须在您的系统路径中。要将其添加到系统路径,请执行以下步骤:
    a. 在经典视图中打开控制面板,双击系统
    b. 单击高级系统设置
    c. 在系统属性中,单击高级选项卡。
    d. 在高级选项卡上,单击环境变量
    e. 在环境变量对话框中,在系统变量下,选择Path,然后单击Edit按钮。
    f. 在编辑系统变量对话框中,将目录添加到变量值框中。使用分号将其与列表中的其他条目分隔开。
    g. 单击确定以关闭编辑系统变量对话框。
    h. 单击确定以关闭环境变量对话框。 i. 单击确定以关闭系统属性对话框。
  13. 现在,使用任何方法启动您的应用程序。Visual Studio将启动并加载应用程序。

4
我喜欢这个答案,因为它适用于在启用PDB的Release模式下构建的代码。如果在Release模式下构建,则上述Debugger.Launch()方法将不起作用。 - Pretzel
4
我需要在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug中添加一个名为“Auto”的字符串值,并将其值设置为1,因为如果没有这个值,vsjitdebugger在打开时会失败。 - user1011138
5
哦,天啊,为什么这个如此复杂。 - yuyoyuppe
这是唯一正确的答案。 - Ian Kemp

15

另一个不错的解决方案是使用Visual Studio扩展程序“ReAttach”,可在此处找到

如果您的进程当前未运行,ReAttach将在其变为可用时要求您启动并附加到它。


11

1
这是我在这里尝试过的所有解决方案中最简单的一个。安装容易,只需运行即可。无需更改代码。 - Brian White
2
这正是我在寻找的!它允许在同一个VS实例中调试子进程。 文档中的快速提示:该强大工具需要本地调试器。这意味着如果您正在调试.NET代码,您必须选择启用混合模式调试。 - Natan
一流的解决方案 - undefined

6
"Entrian Attach"是一个Visual Studio插件,可以帮助您解决以下问题:只需告诉它您的可执行文件的名称,它就会在任何代码运行之前,无论如何启动进程时都会将调试器附加到进程上。
(声明:我是这个插件的作者。我因为经常遇到这个问题而开发了Attach!)"

对我没用……我能看到符号正在加载,但是进程会继续运行并退出。也许是因为我试图附加到一个不在解决方案中的进程,因此没有断点。 - Nelson Rothermel
@NelsonRothermel:我想提供帮助,但 Stack Overflow 不是 Entrian Solutions 技术支持的地方。 :-) 如果你希望我尝试帮助解决问题,请给我发送电子邮件 (richie@entrian.com) - 有一些简单的方法可以尝试。 - RichieHindle
1
我最终使用gflags.exe使其正常工作,对我来说关键是在特定异常类型上中断,因此我认为如果我正确设置了您的解决方案,它实际上也可以起作用。现在我不需要它了,但这是一个有趣的插件,将来可能会有用。 - Nelson Rothermel

5
您还可以使用附带Windows调试工具的gflags.exe工具,您只需要打开gflags.exe,然后进入映像文件,输入进程名称(a.exe),按tab键并选中调试器复选框,在文本框中输入带有选项/ debugexe的vs路径(即“C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ devenv.exe” /debugexe)。
一旦进程运行,自动会打开Visual Studio。您可以添加断点并按Run来进行调试。

2
如下所示:在VS中打开a.exe项目,设置断点等。然后打开a.exe的项目属性,切换到调试选项卡,并将命令设置为c.exe。最后点击调试即可。
不幸的是,我从未在托管项目中进行过此操作,因此可能有所偏差。但是,在非托管(C ++)项目中,这就是我会做的。我认为托管调试器也应该支持它。

1
在我的情况下,我想要调试的可执行文件是作为另一个可执行文件启动的一部分启动的。我猜这就是问题背后的驱动力。 - Mooing Duck
对我来说很有效。对于直接的情况快速简便,但对于更复杂的情况可能不太好用。 - AbstractDissonance

-1
如果C#代码被非托管代码启动,请确保在“项目属性”->“调试选项”中检查“非托管代码调试”。

-1

1
这个模块无法在VS 2013、2015或2017上安装。自2013年末以来就没有更新了。 - Brian White

-1
自从VS 2013 SP2以来,微软提供了一个免费工具,与之前提到的“Spawned Process Catcher”相同 - 它会附加所有由正在调试的进程启动的进程。注意:我只在非托管C ++中测试过(这个工具可以完美地工作)。

Microsoft Child Process Debugging Power Tool

MSDN Blog entry


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