2013-08-16 82 views
0

我想debugg該項目於2010年MSVS 實現 - C++;當我對源代碼進行消磁處理時,MSVS報告了以下故障。訪問voilation閱讀位置

故障報告:

"First chance exception at 0x00000013fb5b9ee in unit.exe: 0xc00000005 access voilation reading location 0x00000000000000c." 

問題的關鍵在於獲取地址。

int base = (*(abc::g_runc1.m_paulsenderpin.m_lastchunk_p)).xcpp::cxcppoutput::m_baseaddress; 

我的項目是非常大的,包括源代碼,

總之它可以被描述爲: - 保羅是與連接到C1發件人銷的模塊。 - xcpp是接口

此源代碼和項目是正確的,並且在ARM編譯器上沒有失敗,但在MSVS上它提供了訪問衝突錯誤。 在msdn上有一些關於由程序集設置的權限的帖子,它避免了讀取所尋址的位置。如果是這樣,如何改變它...? 還是有更好的選擇來找到問題......?

任何幫助表示讚賞。

+0

什麼是'abc :: g_runc1.m_paulsenderpin.m_lastchunk_p'?它是如何聲明的?如果它是一個指針,你檢查它不是'NULL'嗎? –

+0

abc :: g_runc1.m_paulsenderpin.m_lastchunk_p = 0x00000000000 paulsenderpin struct {pinbase,m_currentchunk,m_lastchunk,....}。內存分配給發送者引腳的保持,memblock 1024字節。 除此之外,還有8個這樣的針腳,保羅,波莉,勞爾,..... 除了保羅以外的所有baseaddress都以相同的方式進行了decleared,並且沒有記憶語音錯誤。只有保羅在任何地方都有這個問題。 和MSVS會爲它引發異常,但ARM不會。 –

+0

如果它是零,那麼它意味着它是'NULL',這通常是非法地址。 –

回答

0

問題在於存儲器尋址,在ARM調試器32位和MSVS10 48位尋址中,因爲它MSB字節丟失,所以無法找到正確的存儲器地址...... !!!

0

您的代碼正在嘗試訪問實際不屬於其進程的位置。沒有用戶應用程序的數據可以位於如此接近零的地址。由於你的表情是太長,只需找到其中是包含零基準的成員,我的提示是m_last chunk_p,和m_baseaddress似乎成員在偏移12

有一個簡單的解釋爲什麼你的代碼工作正常時,它的由與ARM一起工作的東西編譯:ARM使用對齊的內存訪問,所以類和結構成員被對齊到完整的塊,儘管它們並不總是使用分配給它們的整個空間。因此,您在代碼中的某處使用更大的指針或錯誤的參數,並且指針被覆蓋。當你與(或不與機器不同的處理器體系結構32/64)的另一種形式(可能是另一個)編譯器編譯它

問題也可能會消失,因爲基本類型的尺寸不總是相同。

您應該嘗試檢查表達式中實際爲零(或可能是12)的指針,並嘗試在其上設置一個監視。確保你在任何地方都能正確使用sizeof

+0

初始化時,m_lastchunk = 0x00000000; 並且根本不會改變,這會導致未處理的異常。 這個錯誤是在很早的階段,在函數的實際工作之前,幾乎不在初始階段。 –

+0

所以沒有什麼不對,因爲你忘了設定它的價值。您還有兩個選擇:您可以在訪問該成員之前初始化該成員,也可以使用「智能代理」僅在訪問數據並且尚未分配數據時才分配數據。 – user35443

+0

我嘗試初始化它,首先它不工作,源代碼應該是ARM/MSVS的通用源代碼。並且我限制了更改引腳c1和xcpp的源代碼,因爲我正在使用這些源代碼生成的結構和定義。 MSVS是否提供了其他...? 我知道它很笨,但由於我的限制,我的修改範圍有限。 –