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

.net 如何在进程创建时附加调试器?,.net,visual-studio-2008,debugging,.net,Visual Studio 2008,Debugging,我想调试一个.NET应用程序,该应用程序在启动时立即失败,并且存在时没有错误消息或日志,但我无法将调试器附加到该应用程序,因为该进程几乎在我运行它之后立即存在。我没有应用程序的源代码,因此无法开始调试。我尝试使用Visual Studio宏启动进程,附加到该进程,然后中断,但该宏太慢,在找到该进程时,该进程已退出: Imports System Imports EnvDTE80 Imports EnvDTE90 Imports System.Diagnostics Public Module

我想调试一个.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那样将调试器附加到新创建的进程

谢谢

你可以使用它,你可以开始这个过程。 您可以使用来反编译并获取源代码,然后从那里继续。 另一个想法是使用来查看流程试图做什么。失败很可能是由于对某些外部事物的依赖造成的。进程监视器可以帮助您找到它


更新:您可以使用reflector加载项创建完整的解决方案并从中进行调试。

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


您可以在Windbg中执行程序,并立即中断或转储内存。在文章的一些评论中,有关于如何从windbg中运行.exe并立即转储的说明。

我认为您可以只执行File\Open\Project/Solution,选择.exe作为解决方案,然后点击F5

创建一个新项目控制台项目就可以了。 在项目上单击鼠标右键,然后选择“属性”。 单击调试选项卡。 选择启动外部程序: 选择程序。 按F5。
您可以通过将web应用程序设置为启动项目从Visual Studio中启动,或者通过将调试器放入“应用程序启动”中来调试应用程序启动。在“应用程序启动”中中断,然后在它点击“调试”对话框时附加。由于我没有源代码,因此这两个选项都不是选项。我试试windbg。然后我可以使用VS调试windbg连接到的进程吗?如果没有,windbg在调试托管程序集局部变量监视、调用堆栈等方面有多有用?windbg是可用的最强大的调试工具之一,比VS的调试器更强大。不幸的是,这也是它自己的环境,它可能相当神秘,在我看来有一个陡峭的学习曲线。你可以使用SOS插件非常有效地调试托管代码-我建议遵循我链接的网站上的前几个教程,它们会让你很好地开始。已经尝试过了。Open>Project/Solution不允许您打开EXE,而Open>File只显示该文件中的资源,但不允许您调试。使用哪个版本的Visual Studio?这很奇怪。使用VS2008 Pro,当我执行文件>打开>项目>项目/解决方案,然后选择任何exe文件(包括从我自己的项目生成的exe)时,我会收到一个错误:所选文件无法作为解决方案或项目打开。请选择解决方案或项目文件。您安装了哪些产品帮助>>?除了C 2008和Web Developer 2008之外,除了热修复程序和第三方插件,你们还有其他的吗?是否有人能够打开EXE文件,或出现上述错误?Process Monitor:尝试过。没有失败,一些内部逻辑决定退出。例如,如果启动时的应用程序在星期六退出,ProcMon不会有帮助。Reflector:应用程序P/调用非托管DLL,并将结果存储在一个局部变量中,由于无法附加托管调试器,我无法查看该变量的内容。关于Reflector-如果我想从分解中重新创建解决方案,如何让它反编译整个程序集并将所有源文件保存到磁盘?或者我需要手动复制/粘贴每个类和方法吗?FileDiscombler Reflector插件非常有用,谢谢!当我在plugnis文件夹中时,我注意到Deblector,一个调试插件,不幸的是它不是很有用,还有reflectil,它允许你注入MSIL指令。我刚刚注射了一个MessageBox.ShowAttach。作为Main中的第一条语句,在按下OK之前,这会给您提供附加调试器所需的时间,但当然John的方法更优越。妙招!在我的例子中,按F5会运行程序,然后它会立即退出。相反,使用单步执行会导致调试器在Main的开头中断。谢谢