2009-09-26 19 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

相關問題