2014-04-28 39 views
1

假設我有一個C#WinForms應用程序,並且它僅由Process.Start(MyModule.exe)通過外部程序啓動。當我的代碼由外部程序啓動時調試Process.Start()

我試着用我的項目屬性調試我的代碼 - >調試 - >開始行動 - >啓動外部程序(與設置適當的工作過程的目錄)。

我enother嘗試是調試 - >附加到進程

UPDATE:我的兩個模塊和外部程序使用一個資源。所以外部程序釋放它,然後調用Process.Start(),等待我的進程退出並再次捕獲資源。所以當你的程序已經運行時,我無法附加。

他們倆都失敗了 - Program.cs從未被擊中。

那麼,如何在這種情況下調試我的代碼?

+0

我*認爲* **附加到進程**應該工作,如果你附加當你的程序已經運行。你是否重視你的應用程序,或附加到其他啓動它的程序? – Kobi

+0

我附加到外部程序。我已更新我的信息以獲取一些信息。 – bairog

回答

6

有兩種方法可以輕鬆解決這個問題。第一種方式是讓你的程序請求調試通過Debugger.Launch()

public static void Main(string[] args) 
{ 
    Debugger.Launch(); 

    //Rest of your code here 
} 

重視它,因爲它在主要的第一件事,這將使像下面顯示一個對話框了
enter image description here

這將使你要附加到正在運行的Visual Studio或啓動一個新實例。

解決這個問題的另一種方式,當你不能使用前面的方法(例如我不認爲它在服務內部工作時)在你的代碼的開始放置一個循環,這個循環將永遠循環直到調試器附加的,這給你足夠的時間去執行你之前嘗試過的「附加到進程」方法而不讓程序進展。

public static void Main(string[] args) 
{ 
    while(!Debugger.IsAttached) 
    { 
     Thread.Sleep(1000); //Sleep 1 second and then check again. 
    } 

    //Rest of your code here 
} 
+0

Thx,這對我很有用。 – bairog

+0

爲了我的興趣:Debugger.Launch()或Debugger.IsAttached()僅在調試配置中編譯代碼時才處於活動狀態? –

+1

@ this.myself這兩種方法在釋放模式下都處於活動狀態,它是['Debug'](http://msdn.microsoft.com/en-us/library/vstudio/system.diagnostics)中的一些功能。調試(v = vs.110).aspx)而不是在調試過程中沒有被編譯的調試器。這是通過['Conditional'](http://msdn.microsoft.com/en-us/library/vstudio/system.diagnostics.conditionalattribute)屬性完成的,如果您右鍵單擊該方法並執行「導航 - >」元數據「,你可以看到你想知道的方法是否具有'[Conditional(」DEBUG「)]屬性。 –

0

有兩種不同的方法可以使用System.Diagnostics.Debugger.Launch()System.Diagnostics.Debugger.Break()第一個將附加一個調試器(讓你選擇哪個)然後什麼也不做。在已經連接的情況下,什麼都不會發生。 在沒有附加調試器的情況下,後者將完全按照Launch的方式執行,並且如果附加了調試器,則將用作斷點。

所以,只需寫System.Diagnostics.Debugger.Break();你想要你的斷點。

這將導致出現一個對話框,詢問您希望如何調試程序(當然這也意味着你應該刪除,當你完成調試的訂單)

在對話框中選擇VS的相應實例(或創建一個新的),並繼續像往常一樣繼續調試

+0

['Debugger.Break()'](http://msdn.microsoft.com/en-US/en-en/library/system.diagnostics.debugger.break(v = vs.100).aspx) - is corrent語法,但它不適用於我 – bairog

+0

什麼不工作?是使用發行版或調試版構建的程序版本? –

+0

調試。我試過**啓動外部程序**的方法 - 點擊外部程序中的相應按鈕後,我的模塊只是打開.. – bairog

相關問題