2012-07-06 99 views
0

我想跟蹤觸發的訪問衝突錯誤。在Delphi中跟蹤訪問衝突

創建線程並執行一些工作。我懷疑他們訪問VCL或變量沒有「同步」。 Madexcept報告顯示訪問衝突發生在窗體close(form1.close;)上,但沒有更高的精度。

我有很多代碼行(約100.000)。

我該怎麼做才能避免花費太多時間? 我在調試器選項中選中了「範圍檢查」。

非常感謝

+1

表單關閉訪問衝突,通常是釋放一個釋放的對象,或者可能線程嘗試同步回到vcl線程,而表單和它的東西正在被釋放。你應該在OnClose中做的第一件事是關閉所有的線程,或者設置一些他們可以用來不同步的屬性。之後,它將調試所有關於表單關閉的東西的析構函數。哦,如果你有他們任何Finalizations。 – 2012-07-06 21:54:53

+0

不是IME。釋放僅在不久之前才釋放的對象才很少導致AV。仍然可以運行線程。 – 2012-07-06 22:24:00

+0

然後,在客戶PC上發生錯誤,以至於我無法調試,因此無法遠程調試。 – user382591 2012-07-07 04:44:00

回答

1

,如果你真的想知道,你可以建立與調試DCU的項目,只是發生異常點之前,把一個斷點。

現在你可以跳進VCL代碼,並希望看到出了什麼問題。

但是,關閉或析構函數中的訪問衝突通常是因爲對象的雙重空閒。例如,您可以釋放由窗體釋放的組件(因爲它由窗體擁有)。

+0

釋放窗體擁有的組件是無害的,因爲組件會告訴它的所有者從其組件列表中刪除自己,所以在組件被釋放後,所有者不會了解組件,所以它不會嘗試再次釋放它。由於未初始化的指向某個隨機地址的指針或引用,或者訪問nil,訪問衝突的發生更爲頻繁。 – 2012-07-06 22:21:27

+4

這種低內存訪問的AV通常表示對象的成員是通過零指針訪問的。 – 2012-07-07 08:28:41

0

嘗試SafeMM,它會幫助你更快地發現錯誤。這裏給出了詳細解釋的video。 但是要小心,這個MM只用於調試,不要在軟件的Release版本中啓用它。