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

My completely managed assembly crashes with an AccessViolationException on .Net 4.5?

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

基本上,我有一个模糊的程序集,它以各种方式崩溃。未混淆的程序集没有问题,但不能保证此处不怪模糊器。(这就是我要解决的问题)

无论如何,模糊的程序集在.NET 4.0上也可以正常运行。如果我在.NET 4.5中禁用JIT优化,它运行得很好。

我试过的:

我试着在IL上调试它。访问冲突似乎来自一个只将某些内容加载到堆栈的IL操作。同样,完全托管的代码。

以防万一它与string.empty有关,我检查了il并用ldstr""替换了所有string::empty调用。现在,我得到的不是访问冲突,而是一个重要的例外

但是,在关闭所有选项的情况下运行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错误。现在它只是更积极地使用内存。