如何调试从.bat启动的外部程序而不是VS2005中的.exe?

时间:2010-01-13 01:11:06

标签: c# visual-studio debugging

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

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

干杯!

5 个答案:

答案 0 :(得分:3)

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

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

  • 从此处下载Windows的调试工具: http://www.microsoft.com/whdc/Devtools/Debugging/default.mspx

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

  • 选择图像文件标签

  • 输入您的exe名称,例如myapplication.exe位于顶部,然后按Tab键

  • 选择底部附近的调试器并输入vsjitdebugger.exe

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

另一种选择是将命令行开关添加到应用程序和批处理文件(例如/ break),并在传递时调用Debugger.Break()。这样可以避免在决定调试时重新编译的麻烦,同时也消除了每次都必须在gflags中检查调试器选项的麻烦。

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

答案 1 :(得分:2)

假设没有其他简单的答案,您可以使用宏来启动并附加到流程。 Samples宏项目中有一个示例宏,它随Visual Studio一起安装,但我在下面粘贴了一个相关的代码片段。有一个宏来执行批处理文件,暂停一下,然后附加到进程 - 您可以将宏添加到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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

制作调试目标时要记住的三件事是:

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

  2. 命令行参数。它们位于单独的文本框中,而不是与exe的路径相同。

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

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

答案 4 :(得分:0)

我建议使用条件中包含的System.Diagnostics.Debugger.Launch()来防止在调试情况之外调用它。这会让您获得一个对话框,询问要使用哪个调试器。如果您已加载项目,则显示的对话框将允许您使用已经运行的VS实例。