2012-06-12 112 views
0

我試圖通過我沒有寫的程序代碼(我有源代碼)。它是一個小型的http服務器。我能夠放置斷點,並且在從main()的線性路徑中運行的任何點都會受到尊重。但是,當我嘗試在響應瀏覽器連接而被調用的行放置斷點時,它只是被忽略。調試套接字服務器代碼

有什麼我不知道調試套接字代碼?我對套接字編程知之甚少,但這不是我想要看到的部分。

這是用Visual C++ 2010

編輯
我發現這個問題。對system有一個深深的嵌套調用,它實際上是用不同的參數再次運行程序。所以它不是一個線程或套接字或其他,它實際上是一個全新的子進程。有沒有什麼辦法讓調試器繼續進行下去?

回答

1

選項1

更改「系統」稱之爲一個「--waitfordebugger」參數傳遞給子進程。然後在main或WinMain中,檢查爲這個參數傳遞的命令行參數。如果檢測到,使您的代碼進入無限循環。

volatile int x = false; 
while (x == false) 
{ 
    Sleep(100); 
} 

當你的孩子進程產生,使用Visual Studio「附加」子進程(頂級菜單中,選擇「調試」和「附加到進程...」)。然後在Sleep語句中設置一個斷點。當斷點被觸發時(應該是立即的),將觀察窗口中的「x」更改爲true,將新斷點設置到要穿過的代碼中的位置。然後按下「繼續」(F5)鍵使程序繼續。

此技術還有其他變體,包括使用等待直到IsDebuggerPresent()API返回TRUE。

選項2

近在你要調試的代碼的地方,插入的DebugBreak()語句。這通常會創建崩潰對話框來彈出打開。如果它提示你附加一個調試器,讓它。否則,只需按照選項1中所述直接連接調試器,然後按下崩潰對話框上的相應按鈕繼續。 YMMV取決於已安裝的異常處理程序的類型和/或系統函數調用是否設置爲隱藏崩潰。