2008-09-23 45 views
2

有一個用C#編寫的桌面應用程序,它嘗試管理套接字連接並失敗,但在將相同的應用程序連接到Visual Studio後成功。爲什麼在連接VS調試器後,應用程序的行爲會有所不同?

它怎麼被調試?

+0

這是一個Heisenbug的例子嗎? http://en.wikipedia.org/wiki/Heisenbug#Heisenbugs – 2008-09-23 12:11:26

+0

沒有它只是我今天遇到的一個應用程序。 – 2008-09-23 12:12:59

回答

0

這是一個時機的經典例子。

如果它在調試器中工作,那麼這意味着你必須重新分解你的代碼來處理這個問題。

現在如果你是一個服務器套接字,它接收來自客戶端的連接並嘗試爲每個連接產生一個線程,你可能不得不考慮使用select()來管理一個線程中的連接。

1

通常情況下,計時問題。是否有涉及的線程?如果是C/C++,那麼可能會有很多原因,因爲內存管理錯誤可能會如何表現。

0

在編譯器下運行時,與獨立運行相比,您可能有變量的默認值不同。如果涉及到線程,競爭條件可能是另一個想法。

如果您通過malloc或new分配RAM,那麼在使用之前請確保內存已正確初始化。

5

我會說計時問題也附加調試器會稍微放慢代碼,這可能意味着競爭條件不會發生。

調試它,試圖將一些日誌代碼添加到您的應用程序,我個人使用log4net

你不應該有和使用malloc的問題,因爲你是在C#編碼等。

如果您正在運行Web應用程序,那麼VS中的cassini webserver和您正在部署的cassini webserver可能也有所不同。

0

我們實際上遇到過類似的問題。時機是其中的關鍵部分。以及向代碼中拋出禁止代碼(主要區別在於調試代碼)。

使用套接字編程,看起來像使用VisualStudio.Net進行調試就像進行額外的Application.DoEvents()調用一樣。除非我們通過調用Application.DoEvents()來允許組件呼吸(例如處理它自己的事件),否則我們發現我們有東西會失敗(非調試)。

0

這可能是因爲你看的副作用在調試器的性能。雖然這裏的其他答案更可能...

相關問題