2012-09-07 21 views
0

我一直在調試一個非常棘手的問題。我完全託管的程序集在.Net 4.5上出現AccessViolationException異常?

基本上,我有一個混淆的程序集,以各種方式崩潰。未混淆的程序集沒有問題,儘管不能保證混淆器不會在這裏受到責備。 (這就是我可能想要修復的問題)

無論如何,混淆程序集在.NET 4.0上運行良好。如果我禁用.Net 4.5中的JIT優化,它運行良好。

我已經試過:

我試圖調試它針對IL。訪問衝突似乎來自IL操作,它只是將某些東西加載到堆棧上。再次,完全託管的代碼。

萬一它涉及到String.Empty,我通過IL就去更換了所有的字符串::空通話與ldstr ""。現在,而不是AccessViolation,我得到一個FatalEngineException

通過它運行關閉所有選項的反混淆器使其工作。基本上,所有的反混淆器沒有打開任何東西,只是幾乎不重新安排IL並插入一些NOP。

此外,可執行文件確實通過了PEVerify,所以這不是問題。

壞可執行文件:Test.exe

好可執行文件:Test-cleaned.exe

違規的堆棧跟蹤:

 
Test.exe!PreEmptive.SoS.Client.Cache.CacheService.ServiceCache() Line 22032 + 0x137 bytes Unknown 
Test.exe!Test.TestConsole.Main(string[] args) Line 14 + 0x6 bytes Unknown 

您可以使用ILDASM兩個可執行文件進行比較。因爲它是重新排序的,但我發現它對我的口味來說太難了。我創建了一個small tool來轉儲該方法的IL,並將這些方法按排序順序排列以便於比較。

壞IL轉儲:testcount.il

好IL轉儲:testcountcleaned.il

無論如何,如果任何人有如何分析這一點,並找出到底是什麼IL碎片導致此任何想法,我欣賞它。

回答

0

解決方案是我們確實有一點P /調用。 .Net 4.5更積極地使用內存。出於某種原因,我們使用的工具在我們的一個結構中剝離了編組屬性。修復了這個bug之後,所有東西都神奇地起作用所以,它根本不是.Net 4.5的錯誤。它現在只是更積極地使用內存。

相關問題