2012-03-13 57 views
4

我寫了一個程序,產生了一些進程。由另一個產生的調試進程

默認情況下,Visual Studio不會調試新進程 - 只有創建新進程的原始進程。

有沒有辦法在代碼中自動將Visual Studio連接到創建時的進程?

+0

既然你要求的VS選項,我只是要提到這是一個評論。 WinDbg + SOS允許您自動附加到子進程。 – 2012-03-13 16:50:04

+0

第二個過程是同一個解決方案中的項目嗎? – 2012-03-13 16:55:52

+0

@Boo是的,它是。 – 2012-03-13 20:19:25

回答

1

爲此,您必須編寫VS加載項或VS包,因爲您需要坐在後臺並等待子進程加載。

這裏是你想做的事一般配方:

  1. 獲取調試進程的ID(即uint processID = DTE.Debugger.CurrentProcess.ProcessID
  2. 添加引用System.Management和使用ManagementEventWatcher聽用於在this thread中描述的新工藝創建。你的查詢應該是"SELECT ProcessID FROM Win32_ProcessStartTrace WHERE ParentProcessID = " + processID
  3. 當一個新的子進程加載時,通過它的processID找到它DTE.Debugger.LocalProcesses,然後調用.Attach()就可以了。
3

來源:debugging a process spawned with CreateProcess in Visual Studio

您可暫時將在調用的DebugBreak()某處你的子進程的 啓動代碼。如果您想調試該進程,這將導致Windows提示 。

編輯: 由於這兩個項目都在同一個解決方案,爲多項目的調試配置VS: (VS2010) 語境單擊Solution Explorer
解決方案節點選擇Set Startup Projects...
在對話框選擇Multiple startup projects單選按鈕
在項目網格中將所有希望調試的項目更改爲ActionStart

+0

我不想臨時做點什麼;在我的父進程中,我想檢查它是否正在調試並自動附加調試器。 – 2012-03-13 16:39:14

+0

那麼這個答案可以解決它從孩子方面..但'臨時'是關於你是否刪除代碼或完全取決於你。 – 2012-03-13 16:43:30

+1

即使使用彈出窗口,它將成爲第二個調試器,而不是主調試器實例。 – 2012-03-13 16:53:39

2

這仍然提供了一個提示,但不附加調試:

if (!Debugger.IsAttached && DebuggerFlagSet()) Debugger.Launch(); 

,然後在父進程

if(Debugger.IsAttached) 
    SetDebuggerFlag() 

你需要爲調試標誌的機制,如磁盤上的文件/ reg鍵/互斥等。

正在啓動的調試器將不會與初始實例相同。

相關問題