visual true studio solucionar registrado para net just jitdebugging habilitar framework especifico error depurador depuración depuracion debugger como aplicación admite activar c# .net visual-studio-2010 jit

c# - true - ¿JIT.Net compiler bug?



no se especifico el depurador jit registrado (1)

El resultado del siguiente Código difiere si se inicia con el depurador en segundo plano o sin él. La diferencia solo está ahí, si la optimización está activada.

Este es el resultado:

-> con optimación: 1000 2008 3016 1001 2009 3007 ...

-> sin optimización (como se esperaba) 1000 1008 1016 1001 1009 1017 ...

Código:

using System; using System.Diagnostics; using System.Runtime.CompilerServices; namespace OptimizerTest { public class Test { int dummy; public void TestFunction(int stepWidth) // stepWidth must be a parameter { for (int step = 0; step < stepWidth; step++) { dummy = step + 1000; // addition with constant ( same value as later !) for (int x = 0; x < 20; x += stepWidth) { int index = x + 1000 + step; // constant must be same as above and ?!?! // int index = x + step + 1000; works !!!!! Console.Write("/n/r" + index); } } } [MethodImpl(MethodImplOptions.NoOptimization)] public void TestFunctionNoOptimization(int stepWidth) { for (int step = 0; step < stepWidth; step++) { dummy = step + 1000; for (int x = 0; x < 20; x += stepWidth) { int index = x + 1000 + step; Console.Write("/n/r" + index); } } } } class Program { /// <summary> /// Result differs from Start with F5 to Ctrl-F5 /// </summary> /// <param name="args"></param> static void Main(string[] args) { Test test = new Test(); Console.Write("/n/r---------/n/roptimized result/n/r-------------" ); test.TestFunction(8); Console.Write("/n/r---------/n/rnot optimized result/n/r-------------"); test.TestFunctionNoOptimization(8); Console.Write("/n/r---------/n/rpress any key"); Console.ReadKey(); } } }

El comportamiento del error depende del número de iteraciones del bucle interno (x <5 todo funciona bien). Muy interesante es que no ocurre cuando uso

int index = x + step + 1000;

en lugar de

int index = x + 1000 + step;

Estoy trabajando con Visual Studio 2010 SP1 y lo probé con .NET Framework de 2.0 a 4.0.3. Siempre he visto el mismo resultado.

¿Alguien sabe acerca de este error o puede reproducirse?


Sí, este es definitivamente un error optimizador de jitter. La razón por la que otros usuarios de SO tienen problemas para reproducirlo es porque solo el jitter x64 parece tener este error. Debe configurar el objetivo de la plataforma del proyecto en AnyCPU, desmarque la opción "Preferir 32 bits" en VS2012 y superior.

No he examinado la razón subyacente con suficiente atención, pero parece fallar al intentar eliminar el step + 1000 común step + 1000 . La eliminación de la subexpresión es una de las optimizaciones de jitter estándar. Pero incorpora incorrectamente el código de expresión dentro del bucle en lugar de mantenerlo fuera del bucle como está escrito. Por ejemplo, verás desaparecer el error cuando escribas:

dummy = step + 999;

Este error aún está presente en la última versión de .NET 4.5.1 (clrjit.dll, v4.0.30319.34003 en mi máquina), también presente en el v2 jitter (mscorjit.dll, v2.0.50727.7905 en mi máquina).

El código es un poco demasiado sintético para recomendar una solución sólida, ya encontraste uno de todos modos para que puedas seguir impulsando tu proyecto. En general, te recomiendo que elimines la subexpresión con:

int index = x + dummy;

Debe informarse a Microsoft, puede hacerlo publicando un informe de error en connect.microsoft.com. Si no quiere tomarse el tiempo, hágamelo saber y me encargaré de ello.