2011-08-29 105 views
3

我正在使用一個大的閉源框架。我最近添加了一個新實體,現在我在執行某些操作時遇到訪問衝突。但是,它們發生在框架內的調用上,所以我不知道我執行的是錯誤的,因爲我沒有收到調用堆棧。調試訪問衝突

在CRT文件tidtable.c中定義的函數_CRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue()中報告違規。具體的行是PFLS_GETVALUE_FUNCTION flsGetValue = FLS_GETVALUE;。我不確定,但我認爲它與函數指針有關?

錯誤消息是Unhandled exception at 0x0000007a in fmwk.exe: 0xC0000005: Access violation reading location 0x0000007a.。我的解釋是,它試圖訪問偏移量爲0x7a的東西到一個對象中,但它被激活了一個空指針。它是否正確?如果是這樣,有沒有辦法找到那個偏移量對應的東西?

下面是調用堆棧:

0000007a() 
fmwk.dll!100f2630()  
[Frames below may be incorrect and/or missing, no symbols loaded for fmwk.dll] 

<lots of framework and windows dlls> 

fmwk.exe!00402ef4()  
msvcr100.dll!__set_flsgetvalue() Line 145 + 0xc bytes C 
msvcr100.dll!_getptd_noexit() Line 498 + 0x7 bytes C 
msvcr100.dll!_getptd() Line 523 + 0x5 bytes C 
msvcr100.dll!_LocaleUpdate::_LocaleUpdate(localeinfo_struct * plocinfo=0x00000000) Line 243 + 0x5 bytes C++ 
msvcr100.dll!x_ismbbtype_l(localeinfo_struct * plocinfo=0x00000000, unsigned int tst=0, int cmask=1386664, int kmask=1414714) Line 219 C++ 
msvcr100.dll!_ismbblead(unsigned int tst=0) Line 172 + 0xe bytes C++ 
fmwk.exe!004010a0()  
fmwk.exe!00404d61()  
kernel32.dll!7c817077()  
+0

也許這是[運行時庫](http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx)不匹配,因爲它看起來像代碼試圖訪問不存在的線程本地存儲(儘管我可能會誤讀堆棧跟蹤錯誤)。 – user786653

回答

2

使用應用程序驗證程序調試此訪問衝突。它應該在更好的調用堆棧比這個更好的調用堆棧發生時提前停止執行。

看起來像你在某處引用NULL指針,但程序沒有立即崩潰,因爲它是未定義行爲,繼續執行,稍後用奇怪的調用堆棧崩潰。

+0

這似乎是一個很好的計劃,謝謝你的提示。但是,要麼我不理解它,要麼它不能幫助我。它會觸發休息,但是調用堆棧在這裏也沒有幫助。唯一可檢查的幀來自應用程序驗證程序本身,可用的數據只是一條錯誤消息「當前堆棧跟蹤的第一次機會訪問衝突」。 – carlpett

+0

您必須加載關閉源框架的調試符號才能獲得有用的調用堆棧。你有他們嗎? – ks1322

+0

不是。我嚴重懷疑我將能夠得到他們:( – carlpett

0

關於您的問題:是的,訪問0x7A可疑看起來像在偏移量0x7a處取消引用NULL指針。 (也可以像引用0x20偏移0x5a一樣)。

沒有源代碼訪問,很難找出發生了什麼。你可以試着回溯你的代碼,並找出你所做的改變,從而使框架得到保護。然後,看看你是否在使用與應該使用的框架函數不同的框架函數。如果這一切似乎都沒有結束,那麼您也可以向您的框架供應商報告錯誤,但我建議您在這之前確保錯誤不在您身邊。

+0

哦,我很確定這個故障是我的。添加新功能需要很多代碼,並且全部都是一次添加的。我重新讀了我的所有代碼幾次,並且無法發現任何錯誤,但我猜測我錯過了初始化一些繼承的函數指針成員(該框架有自己的類模擬,用C語言編寫)。 – carlpett