2017-07-19 28 views
2

我使用ConditionalWeakTable作爲弱事件處理程序實現的一部分。它工作正常,除了偶爾我會從我的用戶那裏得到自動崩潰日誌,表明對GetOrCreateValue()的調用已經崩潰。ConditionalWeakTable.GetOrCreateValue()中的IndexOutOfRangeException

錯誤和調用堆棧看起來像下面的兩個棧之一,我認爲這取決於是否有一個現有的條目或新的一個需要得到創建:

System.IndexOutOfRangeException: Index was outside the bounds of the array. 
    at System.Runtime.CompilerServices.ConditionalWeakTable`2.CreateEntry(TKey key, TValue value) 
    at System.Runtime.CompilerServices.ConditionalWeakTable`2.GetValue(TKey key, CreateValueCallback createValueCallback) 
    at [my code] 

System.IndexOutOfRangeException: Index was outside the bounds of the array. 
    at System.Runtime.CompilerServices.ConditionalWeakTable`2.FindEntry(TKey key) 
    at System.Runtime.CompilerServices.ConditionalWeakTable`2.TryGetValueWorker(TKey key, TValue& value) 
    at System.Runtime.CompilerServices.ConditionalWeakTable`2.TryGetValue(TKey key, TValue& value) 
    at System.Runtime.CompilerServices.ConditionalWeakTable`2.GetValue(TKey key, CreateValueCallback createValueCallback) 
    at [my code] 

(實際調用GetOrCreateValue()出現已被內聯)

這裏是我的代碼,聲明ConditionalWeakTable

private static readonly ConditionalWeakTable<object, Dictionary<EventInfo, object>> s_sourceObjects = new ConditionalWeakTable<object, Dictionary<EventInfo, object>>(); 

這裏是我的代碼,CAL LS GetOrCreateValue()

Dictionary<EventInfo, object> events; 
lock(s_sourceObjects) 
    events = s_sourceObjects.GetOrCreateValue(sourceObject); 

下面是引用s_sourceObjects領域唯一的其它地方:

bool success; 
Dictionary<EventInfo, object> events; 
lock(s_sourceObjects) 
    success = s_sourceObjects.TryGetValue(sourceObject, out events); 

(我加了lock發言,因爲我懷疑這是ConditionalWeakTable線程安全漏洞,儘管文檔聲稱它是線程安全的。但是,即使使用lock語句,該錯誤仍然存​​在,所以顯然這不是線程問題。)

我的應用程序使用.NET 4.6.2。

我是不是有點誤用或不理解ConditionalWeakTable?或者這是一個框架錯誤?如果這是一個框架錯誤,有什麼辦法可以解決它嗎?

下面是該類的全部源代碼,如果任何人希望看到上下文:https://gist.github.com/waltdestler/2a339bdd0d7d647501eb4690772e3b50

+0

他們是**只有**兩個地方你訪問'條件WeakTable'? – mjwills

+0

@mjwills是的,那些只是**兩個地方(除了字段初始值設定項外)。 –

+0

這個異常更可能與s_staticEvents相關。你是在'Debug'還是'Release'模式下運行? – mjwills

回答

0

萬一其他人是否有這個問題,我想跟進什麼原來是這個問題:

我的程序實際上是一個視頻遊戲,事實證明,一些玩家正在使用一個名爲Cheat Engine的工具,它可以用來直接修改內存值。 (例如,改變玩家擁有多少錢的內存。)我發現,每當這次崩潰發生時,Cheat Engine就會運行,這讓我相信玩家正試圖用它來在遊戲中作弊,並且無意中編輯錯誤的內存位置並導致其崩潰。

相關問題