如何在Visual Studio 2010中调试由另一个进程启动的C# .NET应用程序

5
我有一个用C#编写的.NET GUI应用程序和一个PDF打印机。该PDF打印机有一个字段,您可以在其中设置启动外部应用程序的命令。
在这种情况下,我可以使用此打印机打印文档,并且打印机使用生成的PDF文件的文件路径作为参数启动我的EXE文件。当应用程序从打印机启动时,如何调试我的应用程序?
在Visual Studio 2010中,我可以为命令行参数设置调试信息,这很好用。但是,如果应用程序是从打印机启动的,则应用程序无法正常工作。因此,我想在从打印机启动应用程序时进行调试。我该怎么做?是否有一种以调试模式启动EXE文件的参数或类似方法?
3个回答

9

尝试附加到进程:

http://msdn.microsoft.com/en-us/library/c6wf8e4z.aspx

附加到正在运行的进程 1.在“调试”菜单上,选择“附加到进程”。如果没有打开项目,请在“工具”菜单上选择“附加到进程”。

2.在“附加到进程”对话框中,从“可用进程”列表中找到要附加到的程序。

a.如果您要调试的程序在另一台计算机上运行,则必须首先选择远程计算机。有关详细信息,请参阅“如何:选择远程计算机”。

b.如果该进程在不同的用户帐户下运行,请选择“显示所有用户的进程”复选框。

c.如果您通过远程桌面连接进行连接,请选择“显示所有会话中的进程”复选框。

3.在“附加到”框中,确保列出了您将要调试的代码类型。默认的自动设置会尝试确定您要调试的代码类型。如果自动设置不适用:

a.单击“选择”。

b.在“选择代码类型”对话框中,单击“调试这些代码类型”,然后选择要调试的类型。

c.单击“确定”。

4.单击“附加”。

打开“进程”对话框时,“可用进程”列表会自动显示。在对话框打开的同时,进程可以在后台启动和停止。但是,其内容并不总是最新的。您可以随时通过单击“刷新”来刷新列表,以查看当前进程列表。

在调试时,您可以附加到多个程序,但是一次只能在调试器中激活一个程序。您可以在“调试位置”工具栏或“进程”窗口中设置活动程序。有关详细信息,请参阅“如何:设置当前程序”。

所有“调试”菜单执行命令都会影响活动程序。您可以从“进程”对话框中断开任何调试程序,也可以从“调试”菜单中断开所有已附加的程序。有关详细信息,请参阅“如何:中断执行”。


问题是进程没有运行。当我从例如 Word 打印文档时,打印机只会生成一个 PDF 文件并打开我的可执行文件。因此,没有正在运行的进程可以附加。 - CubaLibre
你的应用程序的主机进程是什么? - Alexandre Brisebois
你可以附加到主进程。例如,在过去/现在调试SharePoint时,我们会附加到IIS进程。 - Alexandre Brisebois
我认为启动我的应用程序的打印机是它吗? - CubaLibre
链接已失效。 - Peter Mortensen

8

您可以使用一个小的注册表调整来在进程启动时附加到进程。

前往

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

使用可在任务管理器中显示的可执行文件名称创建一个新密钥,例如myapp.exe。 在此下面,创建一个名为debugger的新字符串值,并将其设置为vsjitdebugger.exe
现在,当触发EXE文件时,将出现一个窗口询问要附加哪个调试器。

非常感谢,这正是我正在寻找的。 - CubaLibre
我有一个问题!当我删除创建的注册表条目时,它没有任何效果。一个窗口仍然出现并询问要附加哪个调试器! - CubaLibre

1
考虑在代码中添加一个调用,明确请求在当前位置附加调试器。这个功能自Win32时代就存在,在.NET中表现为System.Diagnostics.Debugger.Break(和System.Diagnostics.Debugger.Launch)。
如果您不想第一次执行时触发此操作,还可以添加逻辑来决定何时触发。
   #if DEBUG
      if (++staticCounter > 3) System.Diagnostics.Debugger.Break();
   #endif

当然,在生产环境中你需要禁用它。

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