【问题标题】:How to debug a C# .NET application in Visual Studio 2010 that is started from another process如何在 Visual Studio 2010 中调试从另一个进程启动的 C# .NET 应用程序
【发布时间】:2011-05-20 15:26:00
【问题描述】:

我有一个用 C# 编写的 .NET GUI 应用程序和一个 PDF 打印机。 PDF 打印机有一个字段,您可以在其中设置启动外部应用程序的命令。

在这种情况下,我可以使用这台打印机打印文档,并且打印机会以生成的 PDF 文件的文件路径作为参数启动我的 EXE 文件。从打印机启动时如何调试我的应用程序?

在 Visual Studio 2010 中,我可以为命令行参数设置调试信息,这很好用。但是,如果应用程序是从打印机启动的,则应用程序无法正常工作。因此,我想在从打印机启动时调试我的应用程序。我怎样才能做到这一点?是否有一个参数可以在调试模式下启动 EXE 文件或类似的东西?

【问题讨论】:

    标签: c# .net visual-studio-2010 debugging


    【解决方案1】:

    尝试附加到进程:

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

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

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

    a.如果您想要的程序 调试正在另一台计算机上运行, 您必须先选择遥控器 电脑。有关详细信息,请参阅 如何:选择远程计算机。

    b.如果进程在 不同的用户帐户,选择 显示所有用户的进程检查 盒子。

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

    3.在“附加到”框中,确保您要调试的代码类型是 列出。默认自动设置 试图确定什么类型的代码 你想调试。如果自动 设置不合适:

    a.单击选择。

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

    c.单击确定。

    4.单击附加。

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

    您可以连接到多个 调试时的程序,但是 只有一个程序处于活动状态 随时调试。您可以设置 调试位置中的活动程序 工具栏或进程窗口。为了 更多信息,请参阅如何:设置 当前计划。

    所有 Debug 菜单执行命令 影响活动程序。你可以 从 进程对话框或全部中断 调试菜单中的附加程序。 有关详细信息,请参阅如何: 中断执行。

    【讨论】:

    • 问题是进程没有运行。当我从例如打印文档时Word,打印机只制作pdf文件并打开我的exe。所以没有运行附加的进程。
    • 你的应用程序的宿主进程是什么?
    • 您可以附加到主机进程。即在过去/现在调试共享点时,我们附加到 IIS 进程。
    • 我认为启动我的应用程序的打印机,不是吗?
    • 链接已损坏。
    【解决方案2】:

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

    前往

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

    使用将出现在Task Manager 中的可执行文件名称创建一个新密钥,例如myapp.exe。在此之下,创建一个名为debugger 的新字符串值并将其设置为vsjitdebugger.exe

    现在,当触发 EXE 文件时,会出现一个窗口,询问要附加到哪个调试器。

    【讨论】:

    • 非常感谢..这就是我正在寻找的。​​span>
    • 我有问题!当我删除创建的注册表项时,它没有任何效果。仍然出现一个窗口,询问要附加哪个调试器!
    【解决方案3】:

    考虑在您的代码中添加一个调用,明确请求将调试器附加到当前位置。这自 Win32 天以来一直存在,并且在 .NET 中显示为 System.Diagnostics.Debugger.Break(和 System.Diagnostics.Debugger.Launch)。

    如果您不想第一次这样做,您还可以添加逻辑来决定何时触发:

       #if DEBUG
          if (++staticCounter > 3) System.Diagnostics.Debugger.Break();
       #endif
    

    当然,您会希望在生产中禁用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      相关资源
      最近更新 更多