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

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

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

干杯!

假设没有其他简单的答案,您可以使用宏来启动并附加到流程。 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 

如果您不介意每次需要调试时都必须重新编译应用程序,则可以在启动时暂时调用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键

  • 选择底部附近的Debugger并输入vsjitdebugger.exe

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

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

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

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

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

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

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

  2. 命令行参数。 那些进入单独的文本框,而不是与exe的路径相同。

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

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

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