我完全托管的程序集在.Net 4.5上遇到了AccessViolationException崩溃了吗?

时间:2012-09-07 21:38:45

标签: .net debugging jit .net-4.5 il

我一直在调试一个非常棘手的问题。

基本上,我有一个混淆的程序集以各种方式崩溃。未经模糊处理的程序集没有任何问题,但无法保证混淆程序不应归咎于此。 (这就是我可能想要解决的问题)

无论如何,混淆的程序集也可以在.Net 4.0上正常运行。如果我在.Net 4.5中禁用JIT优化,它运行正常。

我尝试了什么:

我尝试对IL进行调试。访问冲突似乎来自IL操作,该操作只是将某些内容加载到堆栈中。同样,完全托管代码。

为了防止它与String.Empty相关,我浏览了IL并用ldstr ""替换了所有string :: empty调用。现在,我得到一个FatalEngine异常,而不是AccessViolation。

通过deobfuscator运行它,关闭所有选项使其工作。基本上,反混淆器所做的一切都没有打开,只是几乎不重新安排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的哪些部分正在造成这种情况,我会很感激。

1 个答案:

答案 0 :(得分:0)

解决方案是我们确实有一点点P / Invoking。 .Net 4.5更积极地使用内存。出于某种原因,我们使用的工具在我们的一个结构上删除了Marshalling属性。修好那个bug后,一切都神奇地起作用了。所以,它根本不是.Net 4.5错误。它现在更积极地使用内存。