【问题标题】:How to attach a debugger at process creation?如何在进程创建时附加调试器?
【发布时间】:2009-09-26 22:10:28
【问题描述】:

我想调试一个在启动时立即失败的 .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 那样将调试器附加到新创建的进程?

谢谢!

【问题讨论】:

    标签: .net visual-studio-2008 debugging


    【解决方案1】:
    1. 创建一个新项目(控制台项目即可)。
    2. 右键单击项目并选择“属性”。
    3. 点击“调试”标签。
    4. 选择“启动外部程序:”
    5. 选择程序。
    6. 按 F5。

    【讨论】:

    • 绝招!就我而言,按 F5 会运行程序,然后它会立即退出。相反,使用 Step Into 会导致调试器在 Main() 的开头中断。谢谢!
    【解决方案2】:

    调试器在附加之前需要进行一定的处理。例如,在 ASP.Net 中,很难在 IIS 上调试“Application_Start”事件,因为它为时过早 - 必须在附加调试器之前启动应用程序。

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

    【讨论】:

    • 您可以调试 Application_Start,方法是通过将其设置为启动项目从 Visual Studio 中启动 Web 应用程序,或者将 Debugger.Break() 放在 Application_Start 中,然后在遇到调试对话框时附加。
    • 两者都不是选项,因为我没有源代码。我会试试windbg。然后我可以使用VS来调试windbg附加到的进程吗?如果不是,windbg 在调试托管程序集(局部变量监视、调用堆栈等)方面有多大用处?
    • Windbg 是可用的最强大的调试工具之一 - 比 VS 的调试器更强大。不幸的是,它也是它自己的环境,可能相当神秘并且有陡峭的学习曲线(IMO)。不过,您可以使用 SOS 插件非常有效地调试托管代码 - 我建议您遵循我链接的网站上的前几个教程,它们会让您很好地开始。
    【解决方案3】:
    1. 您可以使用windbg 从它开始该过程。
    2. 您可以使用reflector 反编译并获取源代码并从那里继续。

    另一个想法是使用process monitor 来查看进程试图做什么。失败很可能是由对某些外部事物的依赖引起的。进程监视器可以帮助您找到它。

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

    【讨论】:

    • 进程监视器:试过了。没有失败,一些内部逻辑做出退出的决定。例如。如果在星期六启动时应用程序退出,ProcMon 将无济于事。反射器:应用程序 P/Invokes 进入非托管 DLL,并将结果存储在一个局部变量中,由于无法附加托管调试器,我无法查看它的内容。
    • 还有关于反射器 - 如果我想从反汇编中重新创建解决方案,我怎样才能让它反编译整个程序集并将所有源文件保存到磁盘?还是我需要手动复制/粘贴每个类和方法?
    • FileDisassembler Reflector 插件非常有用,谢谢!当我在plugnis 文件夹中时,我注意到了Deblector,一个不幸的是它不是很有用的调试插件,以及Reflexil,它允许你注入MSIL 指令。我刚刚注入了 MessageBox.Show("Attach now.") 作为 Main() 中的第一条语句,它为您提供了附加调试器所需的尽可能多的时间(直到您按下 OK),但当然 John 的方法更优越.
    【解决方案4】:

    我认为你可以直接执行“文件\打开\项目/解决方案”,选择 .exe 作为“解决方案”,然后按 F5。

    【讨论】:

    • 已经试过了。 Open > Project/Solution 不允许您打开 EXE,Open > File 仅显示该文件中的资源,但不允许您进行调试。
    • 使用什么版本的 Visual Studio?
    • 这很奇怪。使用 VS2008 Pro,当我执行 File > Open > Project > Project/Solution 然后选择任何 exe 文件(包括从我自己的项目构建的 exe)时,我收到错误消息:“所选文件无法作为解决方案或项目打开。请选择解决方案或项目文件。”您安装了哪些产品(帮助 >> 关于)?除了 C# 2008 和 Web Developer 2008(除了修补程序和 3rd 方插件)之外,您还有其他吗?有没有人能打开EXE文件,还是出现上述错误?
    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2011-09-11
    • 1970-01-01
    • 2018-08-15
    相关资源
    最近更新 更多