2013-07-07 25 views
1

我試圖調試一個由另一個產生的錯誤進程。我試過__debugbreak(); __asm int 3;圖像文件執行,但似乎沒有任何工作。有沒有人有任何想法如何從代碼附加調試器?C++如何調試另一個spwaned的進程

+0

爲什麼你需要從你的代碼中附加調試器? 難道你不能只是定期附加處理? – asafrob

+0

該進程是從另一個進程派生的。調試器附加到原始調試器,我需要調試產生的調試器。 – qballer

回答

2

一個我有時用的是

的MessageBox(NULL, 「附加」, 「附加」,MB_OK)

您需要在SDK和的#include 「WINDOWS.H」 鏈接但是關於它的。一個消息框將彈出並等待,直到您單擊確定。只需在那一刻連接調試器,設置斷點並單擊確定。

只要沒有來自產卵過程的時間關鍵看門狗等待衍生過程的回覆,它就會工作。如果有,您可能需要增加超時時間,以便啓動VS並附加。

0

爲什麼你沒有使用DebugBreak而不是__debugbreak()?

這裏有一個description of the differences

我有情況下就出現在調試器沒有啓動,但實際上有一個隱藏的對話框,提示我要什麼VS會議/版本附着。確保通過窗口進行替換,以確保這不會發生在你身上。

+0

根據該鏈接,唯一的區別是需要系統符號才能獲得可用的調用棧,而另一個則不需要。除此之外,它們是相同的。那麼爲什麼你不使用'__debugbreak()'? –

+0

同意 - 也應該沒有理由爲什麼這不起作用,但由於它不提交提交者,我想知道其他API調用會發生什麼。系統符號通常值得擁有,而且易於通過VS/symsrv進行安裝。 – holtavolt

+0

我試過他們兩個都不工作。 – qballer

3

如果沒有其他作品我有時在衍生進程的開始使用一招 我把

while(1) 
{ 
    Sleep(1000); // +Breakpoint 
} 

附加到該進程啓動後,並使用「設置下一條語句」去傳遞循環。

我通常用它來調試Windows服務的的OnStart()

確保問題解決後,刪除此代碼。

2

Visual Studio對CreateProcess使用DEBUG_ONLY_THIS_PROCESS標誌。您可以切換到windbg,也可以在代碼中附加調試器。例如。獲取活動的VisualStudio.DTE.11.0對象,然後調用_DTE :: Debugger獲取調試器,並調用Debugger :: LocalProcesses獲取進程列表。找到所需的過程(例如通過文件名或創建時間),然後調用Process :: Attach。

+0

有沒有辦法讓Visual Studio調試一個進程和它所產生的所有進程? – bames53

+0

在Microsoft Connect上看到很多請求,不採取任何行動,必須很難重新設計。 –

相關問題