如何在创建进程时附加调试器?

时间:2009-09-26 22:10:28

标签: .net visual-studio-2008 debugging

我想调试一个在启动时立即失败的.NET应用程序(并且没有错误消息或日志存在),但我无法将调试器附加到它,因为该过程几乎在我运行后立即存在。我没有应用程序的源代码,所以我不能做“开始调试”。我尝试使用Visual Studio宏来启动进程,附加到它,然后中断,但宏太慢,当它找到进程时,进程已经退出:

Imports System
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics

Public Module Module1
    Sub RunAndAttach()
        Try
            Dim dbg As Debugger3 = DTE.Debugger
            Dim trans As Transport = dbg.Transports.Item("Default")
            Dim sysProc As Process = System.Diagnostics.Process.Start(New ProcessStartInfo("C:\Temp\CrashingApp.exe") With {.WorkingDirectory = "C:\Temp"})
            Dim proc As EnvDTE90.Process3 = dbg.GetProcesses(trans, "ALLON-PC").Item("CrashingApp.exe")
            If (Not sysProc.HasExited) Then
                proc.Attach()
                proc.Break(False)
            Else
                MsgBox("Process " + proc.Name + " has already has exited.")
            End If
        Catch ex As System.Exception
            MsgBox(ex.Message)
        End Try
    End Sub

End Module

有没有办法将调试器附加到新创建的进程,比如F5呢?

谢谢!

4 个答案:

答案 0 :(得分:21)

  1. 创建一个新项目(控制台项目很好)。
  2. 右键单击项目,然后选择“属性”。
  3. 单击“调试”选项卡。
  4. 选择“启动外部程序:”
  5. 选择程序。
  6. 点击F5。

答案 1 :(得分:3)

调试器需要进行一定量的处理才能连接。例如在ASP.Net中,很难在IIS上调试“Application_Start”事件,因为它太早了 - 必须先启动应用程序才能连接调试器。

您可以在Windbg中执行程序并获得立即中断或内存转储。有一个great tutorial on setting up windbg here,在帖子的一些评论中有关于如何从windbg中运行.exe并立即转储的说明。

答案 2 :(得分:1)

  1. 您可以使用windbg开始此过程。
  2. 您可以使用reflector反编译并获取源代码并从那里继续。
  3. 另一个想法是使用process monitor来查看进程正在尝试执行的操作。失败很可能是由对某些外部事物的依赖造成的。并且进程监视器可以帮助您找到它。

    更新:您可以使用反射器FileDisassembler加载项来创建完整的解决方案并从那里进行调试。

答案 3 :(得分:0)

我认为你可以只做“File \ Open \ Project / Solution”,选择.exe作为“解决方案”,然后点击F5。