【问题标题】:How to debug with external program launched from .bat not an .exe in VS2005?如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?
【发布时间】:2010-01-13 01:11:06
【问题描述】:

在我的 c# 项目的调试属性中,我选择了启动外部程序并选择了我希望将调试器附加到的程序的 .exe。但是,现在我需要从 .bat 文件而不是 .exe 启动程序,但 VS2005 似乎不允许这样做。这可能吗?

编辑:为了澄清,我需要调试从 .bat 生成的 .exe。不调试从“启动外部程序”启动的 .exe,也让 .bat 执行。

干杯!

【问题讨论】:

    标签: c# visual-studio debugging


    【解决方案1】:

    如果您不介意每次需要调试时都重新编译应用程序,您可以在启动时临时调用 System.Diagnostics.Debugger.Break()。这将调用即时调试对话框,并允许您在调用 Debugger.Break() 时附加。

    您还可以使用名为“全局标志”/gflags 的工具为具有给定名称的 exe 启用 JIT 调试。使用此选项,无需修改源代码或重新编译。

    • 从这里下载 windows 调试工具: http://www.microsoft.com/whdc/Devtools/Debugging/default.mspx

    • 在 C:\Program Files\Debugging Tools for Windows\gflags.exe 中运行 gflags.exe

    • 选择图像文件选项卡

    • 输入您的 exe 的名称,例如myapplication.exe 在顶部,然后按 tab

    • 选择靠近底部的Debugger,输入vsjitdebugger.exe

    只要设置了此标志,就会在应用程序启动时提示您对其进行调试。

    另一种选择是向您的应用程序和批处理文件(例如 /break)添加命令行开关,并且仅在通过时调用 Debugger.Break()。这避免了当您决定调试时需要重新编译,也消除了每次都必须在 gflags 中检查调试器选项的麻烦。

    这些方法的明显优势在于,它们消除了应用程序启动和可以附加之间的任何类型的竞争。

    【讨论】:

    【解决方案2】:

    假设没有其他简单的答案,您可以使用宏来启动并附加到进程。 Samples 宏项目中有一个示例宏,它与 Visual Studio 一起安装,但我在下面粘贴了一个相关的 sn-p。一旦有一个宏来执行批处理文件,暂停一下,然后附加到进程中 - 您可以将宏添加到 Visual Studio 工具栏,这样您就可以通过单击来运行它。

    ' Lifted from Samples.vsmacros '
    ' VSDebugger.AttachToCalc '
    Sub AttachToCalc()
        Dim attached As Boolean = False
        Dim proc As EnvDTE.Process
    
        For Each proc In DTE.Debugger.LocalProcesses
            If (Right(proc.Name, 8) = "calc.exe") Then
                proc.Attach()
                attached = True
                Exit For
            End If
        Next
    
        If attached = False Then
            MsgBox("calc.exe is not running")
        End If
    
    End Sub
    

    【讨论】:

    • 谢谢!在我的情况下,这似乎是阻力最小的路径。
    【解决方案3】:

    调试不直接启动的 EXE 文件的唯一方法是将调试器附加到已运行的进程。这需要您有足够的时间来参与该流程,但情况可能并非总是如此。

    【讨论】:

      【解决方案4】:

      我建议隔离需要批处理文件来启动程序的因素。我从来没有遇到过无法通过在项目配置的调试部分中指定所有信息来调试可执行文件的情况。

      将 exe 设置为调试目标时要记住的三件事是:

      1. 可执行文件的路径。它需要是完整的路径。如果可执行文件由您的项目输出,您可以使用诸如$(OutDir) 之类的VS 宏来指定它。

      2. 命令行参数。它们放在单独的文本框中,与 exe 的路径不在同一个文本框中。

      3. 工作目录。那是启动可执行文件的目录。有些程序可能对此很敏感。 C# 项目的默认值是输出目录,来自内存。

      如果每次调试时都需要运行批处理文件,那么您可以尝试对其进行编辑以不调用可执行文件并将该批处理文件作为构建后步骤运行。

      【讨论】:

      • 我不同意你的第一段。我有同样的问题,批处理文件在这里是为了规避 Excel 2007 中的一个错误,该错误阻止它从命令行参数启动(第 3 方)XLL。所以我也想解决这个问题。
      【解决方案5】:

      我建议使用 System.Diagnostics.Debugger.Launch() 括在有条件的东西中,以防止在调试情况之外调用它。这会给你一个对话框,询问要使用哪个调试器。如果您加载了项目,显示的对话框将显示一个 etry,允许您使用已运行的 VS 实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-13
        • 2014-10-01
        相关资源
        最近更新 更多