My completely managed assembly crashes with an AccessViolationException on .Net 4.5?
我一直在调试一个非常棘手的问题。
基本上,我有一个模糊的程序集,它以各种方式崩溃。未混淆的程序集没有问题,但不能保证此处不怪模糊器。(这就是我要解决的问题)
无论如何,模糊的程序集在.NET 4.0上也可以正常运行。如果我在.NET 4.5中禁用JIT优化,它运行得很好。
我试过的:
我试着在IL上调试它。访问冲突似乎来自一个只将某些内容加载到堆栈的IL操作。同样,完全托管的代码。
以防万一它与string.empty有关,我检查了il并用
但是,在关闭所有选项的情况下运行deobfuscator可以使其工作。基本上,deobfuscator在没有打开的情况下所做的只是重新排列IL并插入一些nop。
另外,可执行文件确实通过了peverify,所以这不是一个问题。
错误的可执行文件:test.exe
好的可执行文件:test-cleaned.exe
有问题的stacktrace:
1 2 | 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比较两个可执行文件。因为它被重新排序了,所以我觉得有点太难了。我制作了一个小工具来转储方法的IL,并将这些方法按排序顺序排列,以便于比较。
错误的IL转储:testcount.il
好的IL转储:testcountcleaned.il
不管怎样,如果有人对如何分析这个问题有任何想法,并弄清楚是什么导致了这个问题,我会很感激的。
解决方案是我们确实有一点P/调用。.NET 4.5更积极地使用内存。出于某种原因,我们在一个结构上使用的工具去掉了marshalling属性。在修复了那个bug之后,一切都神奇地工作了。所以,这根本不是一个.NET 4.5错误。现在它只是更积极地使用内存。