2013-04-03 376 views
-2

Delphi 7 Code的相同版本已在我們組織的計算機上部署。在地址處解決訪問衝突問題。地址讀取00000000

每次用戶A訪問計算機F1紀錄Z,會顯示以下錯誤:

Access violation at address 00642E83 in module 'foo.exe'. Read of address 00000000 

我注視着我的用戶我自己的電腦上相同的步驟,和另一臺計算機上的另一個人的用戶,並且一直無法複製它(因此,無法調試...)。

所要求的其他信息(不知道如何有幫助這將是)

  • 記錄Z是在Interbase的DB一列保持接觸,並調用誰也打電話人的歷史。
  • 所有在我們組織的計算機使用相同的Windows 7建立

所以當...

  • 用戶B在計算機F2上訪問記錄Z時沒有錯誤。
  • 用戶C在計算機F3上訪問記錄Z時沒有錯誤。
  • 用戶A在計算機F4上訪問記錄Z時沒有錯誤。
  • 用戶A在計算機F1上訪問記錄Z(重新啓動後),在提及的相同地址上出現相同的錯誤。

看來計算機F1是罪魁禍首。 但是,在這一點上,我不確定如何進一步排除故障。

有什麼建議嗎?

+4

我相信完全不可能回答這個問題。 – 2013-04-03 21:16:56

+0

@AndreasRejbrand - 在我的聲明中是否有信息會改變「完全不可能」? – 2013-04-03 21:18:39

+0

你應該告訴我們,例如,'Z'是什麼樣的'記錄',以及它是如何'訪問'的。你還應該告訴我們計算機「F1」(一個不同的操作系統?)的特殊之處。但即使如此,我懷疑我們能做得比猜想還多。只有你得到了代碼。 – 2013-04-03 21:20:57

回答

9

目前,我們沒有足夠的信息來進行調試。但足以給你一些有用的線索:

訪問衝突,讀取地址00000000,意味着有人試圖解引用空指針。這通常(但不總是)尚未構建的對象。

訪問衝突像00642E83地址(在這個過程中的空間一批地方,而不是像00000000或FFFFFFF8)表示,這是數據訪問。如果你在這個值的地址空間的某個或另一個極端獲得了一個數字,那就表明你試圖跳轉到一個無效的代碼地址;這通常發生在如果您嘗試對仍然爲nil的對象調用虛擬方法。

評論中的「500 - 內部服務器錯誤」給出的建議可能無濟於事,因爲從一個系統到另一個系統,事物加載到的地址空間並不總是一致的,但他處於正確的軌道上。

如果你不能在你的調試器中重現它,但它在某個系統上一致地重現,你需要從該系統獲得有用的調試信息。有兩種方法可以實現這一點:在他們的系統上附加一個調試器(在大多數情況下不太可行)或使用錯誤記錄器來執行

錯誤記錄器在現代開發中是一個非常有用的工具,我推薦使用任何將被部署到任何不受控制的計算機的產品。基本上,它會在程序中安裝一些額外的代碼,以捕獲未處理的異常並生成錯誤報告以發回給您。報告通常會包含各種有用的信息,包括完整的堆棧跟蹤信息當你有其中之一時,訪問違規通常很容易追蹤並解決。

德爾福最常見的錯誤記錄工具是EurekaLogMadExcept。我已經同時使用(EurekaLog專業工作和MadExcept進行個人開發),並且我會向任何需要錯誤記錄器的Delphi開發人員推薦其中一個。你需要做的是用這兩種工具之一重建你的項目,將它發送給有計算機的客戶端,這些客戶端會導致一些事情的失誤,並告訴他們重現錯誤並將錯誤報告發送給你。這應該給你你需要的信息來追蹤錯誤。

+0

謝謝@梅森!由於代碼是古老的(15年以上的文檔),所以我不確定如何從這裏進行調試。你已經給了我一個關於如何進一步排除故障的好方向! – 2013-04-03 21:41:15

+2

作爲比較,我們公司使用的軟件自Delphi 1發佈以來一直存在,包括16個不同的Delphi項目(EXE和DLL以及一個軟件包),總計約有1000萬行代碼。如果我們在追蹤訪問違規方面沒有問題,那對您來說肯定會更容易。而MadExcept是我們的選擇記錄器。 – 2013-04-03 23:10:36

相關問題