Visual Studio:生成流程时自动附加到流程


75

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


您能给我们更多背景吗?您是否拥有该过程-是您的代码吗?该过程正在调用您的代码吗?
哈科·普雷托里乌斯2009年

Answers:


73

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


31

请参阅MSDN文章“如何:自动启动调试器-这将使人们跳过单击确认对话框的繁琐工作(无需关闭UAC或其他混乱)”。本文列出了以下步骤:

  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. 将名称更改为调试器。
  8. 右键单击新的字符串值,然后在快捷菜单上单击“修改”。出现“编辑字符串”对话框。
  9. 在“数值数据”框中,键入vsjitdebugger.exe
  10. 单击确定
  11. 注册表菜单中,单击退出
  12. 包含vsjitdebugger.exe的目录必须位于您的系统路径中。将它添加到系统路径,请按照下列步骤操作:
    一。在“经典”视图中打开“控制面板”,然后双击“系统”
    b。单击高级系统设置
    C。在“系统属性”中,单击“高级”选项卡。
    d。在高级选项卡上,单击环境变量
    e。在“环境变量”对话框的“系统变量”下,选择“路径”,然后单击“编辑”按钮。
    F。在里面在“编辑系统变量”对话框中,将目录添加到“变量值”框中。使用分号将其与列表中的其他条目分开。
    G。单击“确定”关闭“编辑系统变量”对话框。
    H。单击“确定”关闭“环境变量”对话框。一世。单击“确定”关闭“系统属性”对话框。
  13. 现在,使用任何方法来启动您的应用程序。Visual Studio将启动并加载应用程序

3
我喜欢这个答案,因为如果您的代码是在启用PDB的发布模式下构建的,那么它会起作用。如果在发布模式下构建,则上面的Debugger.Launch()方法将不起作用。
椒盐脆饼

1
我还需要在HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug中添加一个字符串值“ 1”,其值为1,因为如果没有该vsjitdebugger,打开时将失败
user1011138

2
哦,上帝,为什么会如此参与
yuyoyuppe

10

另一个不错的解决方案是使用Visual Studio扩展“ ReAttach”。可以在这里找到

如果您的进程当前未在运行,则ReAttach会要求您启动它并在它可用时立即附加到它。


9

在验收测试中启动控制台应用程序时,我一直在寻找实现此目的的方法。

我今天发现了这个-https: //blogs.msdn.microsoft.com/visualstudioalm/2014/11/24/introducing-the-child-process-debugging-power-tool/

这是Visual Studio的一个附加组件,它可以很好地发挥作用。当我调试验收测试(我使用Resharper测试运行程序)并将断点放置在启动的应用程序中时,现在可以在同一Visual Studio实例中调试该应用程序。


这是我在这里尝试过的所有解决方案中最简单的一种。易于安装并且可以正常工作。无需更改代码。
布赖恩·怀特

6

“ Entrian Attach”是一个精确执行此操作的Visual Studio加载项-您告诉它可执行文件的名称,并且在进程启动时(无论启动方式如何)在运行任何代码之前,它会附加调试器。

(披露:我是作者。我建立了Attach,因为我一直都遇到这个问题!)


不适用于我...我可以看到符号正在加载,但是随后该过程将继续运行并退出。可能是因为我试图附加到解决方案中没有的流程,因此没有断点。
尼尔森·罗瑟梅尔2014年

@NelsonRothermel:我想提供帮助,但是Stack Overflow并不是Entrian Solutions技术支持的地方。:-)如果您希望我尝试解决您的问题,请给我发电子邮件(richie@entrian.com)-有一些简单的方法可以尝试。
RichieHindle 2014年

1
我最终使它与gflags.exe一起使用,而对我来说,关键是打破某个异常类型,因此,如果我正确设置它,我认为您的解决方案将真正起作用。我现在不再需要它,但是它是一个有趣的插件,我将来可能会用到。
尼尔森·罗瑟梅尔2014年

4

您还可以使用Windows调试工具附带的gflags.exe util,只需打开gflags.exe,然后转到图像文件,输入进程名称(a.exe),然后按Tab,然后在TextBox中选中debugger复选框。输入带有选项/ debugexe的vs路径(即“ C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ devenv.exe” / debugexe)

进程运行后,自动Visual Studio将打开,您可以添加断点并按Run。


3

如何操作:a.exe在VS中打开项目,设置断点等。然后为a.exe,“调试”选项卡打开“项目属性” ,并将“命令”设置为。然后只需点击Debug即可c.exe

不幸的是,我从未在托管项目中做到过这一点,因此在这里我可能会偏离常规。但是,这就是我要对非托管(C ++)项目执行的方式。我认为托管调试器也应该支持它。


1
在我的情况下,我要调试的可执行文件是另一个可执行文件启动过程的一部分。我想这就是问题背后的驱动力。
Mooing Duck 2013年

为我工作。对于直接案件,快速简便,但对于较复杂的案件可能不利。
AbstractDissonance

0

如果非托管代码正在启动C#代码,请确保选中“非托管代码调试” @Project属性->调试选项。


0

我真的很喜欢Entrian Attach提出的Entrian Attach,但是我也发现了这个免费的工具,它可以完成类似的工作。它捕获由调试过程启动的所有过程。

产生的流程捕捉器:https ://marketplace.visualstudio.com/items?itemName = Brubtsov.SpawnedProcessCatcher


1
此模块不会安装在VS 2013年,2015年,2017年或以后还未迟到2013年更新
布莱恩·怀特

0

从VS 2013 SP2开始,Microsoft提供了一个免费工具,其功能与前面提到的“ Spawned Process Catcher”相同-附加所有进程,这些进程由已在调试中的进程启动。注意:我仅使用非托管C ++对此进行了测试(这可以完美地工作)。

Microsoft子进程调试功能工具

MSDN博客条目

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.