2009-10-22 9 views
11

Me he encontrado con un problema tan extraño, que he grabado mi sesión porque no creía que nadie me creería.If rareza de la declaración en Visual Studio 2008

Me encontré con un error que parece estar en un nivel muy fundamental. Esta es una aplicación de subproceso único y todo lo que hago es evaluar un booleano.

El booleano es igual a falso, sin embargo, la instrucción if se está ejecutando como si fuera cierto ... más o menos. Verás a qué me refiero. Limpié la solución y la reconstruí muchas veces. Ni idea de lo que está pasando.

Me encantaría algunas explicaciones, por favor.

http://www.youtube.com/watch?v=ope9kxEyt4g

+0

+1 para el video. – GenericTypeTea

+0

¿qué versión de VS? ¿tiene aplicado el último service pack? –

+0

VS2008 + Último service pack –

Respuesta

6

Mi conjetura es que algo extraño está sucediendo en la implementación, por lo que la AP no está sincronizado con el código real. Si usa el registro en lugar del depurador para resolver lo que está sucediendo, sospecho que verá un comportamiento más sensato. Dudo que sea el CLR mismo el que se comporta de manera extraña con un "si": es mucho más probable que se trate de una incoherencia de depuración/tiempo de ejecución.

+0

He borrado la carpeta bin yo mismo, estamos hablando de una nueva versión. Me gusta la idea de poner en las declaraciones de depuración para ver qué está pasando. Voy a intentar esto. Gracias Jon. –

+0

Segundo eso. La depuración de la aplicación ASP.NET que estoy actualizando a veces arroja el depurador un poco.El ejemplo más simple es cuando insertas un código en un método, comienzas a depurar y ves que esas líneas nunca se ejecutan, simplemente se saltan. O cuando el depurador resalta una línea, pero en realidad ejecuta la siguiente. Borrar obj/y bin/folder siempre me ayuda. – Audrius

0

Creo que esto parece un caso en el que los intervalos de escala de depuración están justo al lado. No siempre se puede confiar en el resalte amarillo en el depurador. En realidad, no estás interviniendo. En versiones anteriores de Be # teníamos muchos errores como este, donde el punto culminante amarillo saltaba como loco. El resaltado del depurador está principalmente a merced de lo que el compilador escriba en el archivo .pdb como el 'rango de origen' que corresponde a un conjunto de instrucciones compilado en particular.

¿Qué versión de VS/C# es esto?

EDIT Después de haber visto las respuestas de otros, de hecho una causa probable es que su archivo .pdb no está sincronizado con su .dll.

+0

Intentaré borrar los archivos obj y todas las otras temp y archivos generados cuando regrese a trabajar el lunes. Los mantendré a todos informados. –

+0

Estoy usando .NET framework 3.5 y VS2008 –

8

Lo he visto muchas veces en el pasado. Básicamente, lo que está sucediendo es que el código que está depurando no coincide con el código que está viendo.

No sé qué causa esto y la solución sigue las directrices de culto de carga.

  • Cerrar todas las copias de Visual Studio
  • borrar todos los bin y carpetas de objetos para este proyecto
  • borrar todos los bin y carpetas de objetos para todos los proyectos .NET
  • Eliminar todos los archivos yo encontrar en "C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Archivos temporales de ASP.NET"
+19

¡no te olvides de sacrificar una cabra (por si acaso)! –

+0

He eliminado todos los archivos en la carpeta bin, me olvidé por completo de obj y los archivos asp temporales. Daré una oportunidad. Todavía no entiendo por qué hardcoding a false genera el resultado deseado o por qué poner en una declaración else corrige el problema. –

+0

Lamento tener que votar su respuesta, pero resulta que hacer todas esas cosas todavía no solucionó el problema. He borrado todas las carpetas bin, la carpeta Obj, todos los archivos asp temporales tanto x86 como x64 y siguen teniendo los mismos problemas. –

0

Tuve exactamente el mismo problema hace una semana. También tiene VS2008, el último SP. Aplicación WinForms. El valor era falso pero el cuerpo if siempre se ejecutó. Estaba haciendo las mismas investigaciones que en tu video. Aquí está mi pedazo de código:

if (CurrentFileFormatVersion > int.Parse(metaInfo.SimulationFileVersion)) 
    throw new SimulationFormatException(ws, ss); 

Correr sin depurador compilado como 'Liberar' estaba bien. Intentalo.

Supongo que hay un error en el depurador VS2008. De alguna manera reproducible con palabras clave 'si' y 'tiro'.

EDITAR: la palabra 'ejecutada' anterior es incorrecta, por supuesto. 'Ingreso pero no ejecutado' se debe usar en su lugar.

+1

¿Se ejecutó realmente el bloque if o simplemente lo destacó el depurador? En el video de Vince parece que el código no se ejecuta (el objeto de excepción e es nulo). –

+0

No se ejecutó como en video. –

3

He visto un caso similar hace mucho tiempo, en Delphi, así que mi pregunta es esta: ¿Estás compilando para Release o Debug, con o sin optimizaciones?

La razón por la que estoy preguntando es que una vez, durante una sesión de depuración, descubrí un pequeño procedimiento que consistía en 4-5 líneas de código que, según el depurador, parecían estar ejecutándose en reversa.

Básicamente, con el siguiente tipo de código:

procedure Test; 
begin 
    Line1; 
    Line2; 
    Line3; 
    line4; 
end; 

El orden de ejecución, de acuerdo con el depurador, era la siguiente:

procedure Test; 
begin    start -+ 
    Line1;    |        +-> here -+ 
    Line2;    |     +-> here -+   | 
    Line3;    |   +-> here -+     | 
    line4;    +-> here -+        | 
end;                +-> end 

La razón era que las líneas era libre de efectos secundarios entre ellos, por lo que el compilador "optimizó" el código reescribiéndolo, reorganizando el código para que parezca ejecutarse completamente en reversa.

Entonces, ¿tiene una instrucción throw más abajo que en realidad es la que se ejecuta, pero el compilador muestra esto como la que tiene problemas, porque, debido a la reorganización del código, dos declaraciones de tiro son en realidad solo emitido una vez como código ejecutable?

Nota: No tengo ninguna razón para saber que esto es lo que está haciendo Visual Studio, pero esto fue lo que me vino a la mente al ver su video.

0

Simplemente añadiendo un "yo también" aquí en funky resaltado de código. Estoy ejecutando VS2008 con C#. Tengo un proyecto de Windows Forms que hace referencia a una biblioteca de clases en otro proyecto y estoy depurando ambos línea por línea. "En algún momento", el resaltado amarillo en la depuración estaba entre 14 y 20 líneas de la línea real que se estaba ejecutando.

Cerré VS, abrí los directorios para ambos proyectos, eliminé todo de bin/Debug y obj/Debug en ambos directorios, luego reinicié VS. Al volver a compilar y pasar por la depuración, todo estaba bien de nuevo.

No sé si el problema estaba en un archivo .manifest, .pdb o tal vez en un archivo .Cache. No importa. Blow um all away y todo irá bien.

FWIW, Google fue casi inútil excepto que devolvió este hilo SO. El resto de los hits fueron sobre problemas con las plantillas de VC++ y VS2005, donde un SP solucionó ese problema. Este no es el mismo problema.

+0

Renuncié a este problema. Intenté todo, eliminé todas las DLL de los archivos de Internet temporales, todos los archivos locales en Bin e incluso moví la solución a otra PC. El problema parece estar en el depurador y no estoy seguro de por qué. –

Cuestiones relacionadas