2009-09-26 16 views
16

我想调试一个在启动时立即失败的.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呢?

谢谢!

回答

20
  1. 创建一个新项目(一个控制台项目是好的)。
  2. 右键单击该项目并选择“属性”。
  3. 单击“调试”选项卡。
  4. 选择“开始外部程序:”
  5. 选择程序。
  6. 命中F5。
+1

巧妙的把戏!就我而言,击中F5会运行程序,然后立即退出。相反,使用Step Into会导致调试器在Main()的开始处出现中断。谢谢! – 2009-09-27 02:52:43

1
  1. 您可以使用windbg从中启动该过程。
  2. 您可以使用reflector进行反编译并获取源代码并从此处继续。

另一个想法是使用process monitor来查看过程正在尝试做什么。这种失败很可能是由于对某些外部事物的依赖造成的。过程监视器可以帮助您找到它。

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

+0

Process Monitor:试过了。没有失败,一些内部逻辑决定退出。例如。如果启动时的应用程序在星期六退出,ProcMon将无法提供帮助。 Reflector:应用程序P /调用非托管DLL,并将结果存储在本地变量中,由于无法连接托管调试程序,因此无法查看它的内容。 – 2009-09-26 23:05:02

+0

另外关于反射器 - 如果我想从反汇编中重新创建解决方案,我如何获得它来反编译整个程序集并将所有源文件保存到磁盘?或者我需要手动复制/粘贴每个类和方法? – 2009-09-26 23:13:00

+0

FileDisassembler Reflector插件非常有用,谢谢!当我在plugnis文件夹中时,我注意到了Deblector,一个调试插件,它不幸并不是非常有用,而Reflexil允许您注入MSIL指令。我只是在Main()中注入了一个MessageBox.Show(“Attach now。”)作为第一个语句,它给你足够多的时间来连接调试器(直到你按OK),但是当然John的方法是优越的。 – 2009-09-27 17:44:25

3

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

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

+4

您可以调试Application_Start,方法是从Visual Studio中启动Web应用程序,方法是将其设置为启动项目,或者在Application_Start中放入Debugger.Break(),然后在打到调试对话框时进行附加。 – adrianbanks 2009-09-26 22:39:12

+0

Debugger.Break()的好处。 – womp 2009-09-26 22:56:45

+0

这两个都不是选项,因为我没有源代码。我会试试windbg。我可以使用VS调试windbg所附的进程吗?如果没有,windbg在调试托管程序集(局部变量监视,调用堆栈等)方面有多大用处? – 2009-09-26 23:09:03

0

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

+0

已经尝试过。打开>项目/解决方案不允许您打开EXE,而打开>文件只是显示该文件中的资源,但不允许您进行调试。 – 2009-09-26 22:58:08

+0

它适用于我,嗯。 – Brian 2009-09-26 23:01:26

+0

使用什么版本的Visual Studio? – 2009-09-26 23:17:39

相关问题