2012-09-07 44 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的错误。它现在只是更积极地使用内存。

相关问题