2010-12-06 7 views
7

Estoy usando VS 2010 Professional (en Windows 7 Professional 64), escribiendo con WCF 4.0. Tengo el siguiente código:depurador visual studio 2010 - pasos en una instrucción "if" a pesar de la condición false

 if (responseMessage.StatusCode == HttpStatusCode.NotFound) 
     {     
      throw new ContentNotFoundException(contentId, SSPErrorCode.PartnerRestGetStream404); 
     } 

Al colocar el depurador al proceso, habiendo un punto de ruptura en el "if" o antes de que, mientras que la condición es falsa (responseMessage.StatusCode es 'OK') , el depurador entra en la instrucción "if". A continuación, pasa por encima de la instrucción "arrojar" sin hacer nada, y luego continúa con el código.

He intentado:

reinicio VS, cerrar la sesión mi usuario de Windows, reiniciar, la limpieza de la solución, la construcción de nuevo, su reconstrucción, reciclar el grupo de aplicaciones, resarting IIS, la adición de más código dentro del "si "declaración y dentro de la condición - nada funcionó hasta ahora.

Debe haber un caché en alguna parte que pueda limpiar para deshacerse de él, pero ¿qué y dónde?

Haciendo búsquedas en Google solo encontré http: social.msdn.microsoft.com/Forums/en-US/vsdebug/thread/d4b70fd7-b74a-42ce-a538-7185df3d3254/, así que intenté establecer manualmente el punto de interrupción, y no se rompió en esta clase, aunque lo mismo se rompió en otras clases.

Me encantaría solucionar esto sin reinstalar VS. ¡Gracias de antemano!


actualización:

  1. desde que puse esto y no podía encontrar una respuesta, me mudé con mi proyecto.
  2. me encontré con este problema, reportado por John MacIntyre en this post, que termina con un ejemplo simplificado:
using System; 

namespace IEnumerableBug2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (new object() == null) 
       throw new Exception(); 
      try { } catch { } 
     } 
    } 
} 

Actualización # 2:

Nota que mi El método también tiene una declaración try-catch, unas líneas después de la declaración 'if'.

Acabo de intentar reproducir este error de nuevo y he fallado. Voy a dejar la pregunta en stackoverflow para otros que puedan necesitarla, pero, como escribí, ya no puedo reproducir el comportamiento.

+0

Parece un error genuino en el IDE. Informar a MS. – Martin

+0

Esto parece corregido en Visual Studio 11 cuando se orienta a .NET 4.5; sin embargo, el error persiste al dirigirse a .NET 4.0. –

+0

Gracias por avisarme. –

Respuesta

0

Aunque de hecho pasaron cosas más extrañas, dudo mucho que se trate de un error en la instalación del depurador o del mal VS defectuoso.

Creo que algo debe estar sucediendo para no interferir correctamente. ¿Pusiste la expresión "responseMessage.StatusCode == HttpStatusCode.NotFound" en la ventana de Debug Watch? ¿Qué devuelve? ¿Es posible que StatusCode regrese un valor diferente cada vez? ¿Intentó evaluarlo varias veces para asegurarse de que sea consistente?

La única forma en que podría imaginar que esto ocurra es si se cambió el código, y cuando se le preguntó si desea o no depurar el archivo fuente aunque su versión no coincida, respondió Sí.Esto explicaría por qué puedes omitir la línea "lanzar" sin que haga nada: no estás depurando el código real que estás viendo, sino una versión anterior. Para solucionarlo, reconstruya todo y nunca diga sí cuando se le solicite si desea depurar aunque haya una discrepancia en la versión, ¡es demasiado confuso!

+0

Gracias por su respuesta. Omer. Lamento decir que no es eso. He comprobado el valor del código de retorno, y lo he hecho varias veces, y también me he asegurado de que la condición en sí devuelva 'falso'. Sí, hay una gran posibilidad de que el motivo sea una caché de código que se depure, que no es la última versión del código, sin embargo, como escribí en mi pregunta, he limpiado la solución, reconstruido e incluso restablecido el IIS y la máquina misma. También mostré este extraño comportamiento a algunos de mis colegas, y a mi jefe, y ellos probaron y revisaron, por lo que no puede ser que lo haya soñado ... –

+0

Si establece un nuevo punto de interrupción en la declaración If, o en la declaración de lanzamiento, ¿el ícono de punto de interrupción en el margen del editor de código aparece completamente rojo, o es solo un círculo rojo sin llenar? Si no es completamente rojo, justo después de reconstruir todo, abra la ventana Módulos y encuentre la ruta desde la que la aplicación cargó su archivo DLL. Vaya a esa ruta en el explorador y verifique que el archivo DLL se haya creado "ahora", y no hace algún tiempo. –

+0

Además, si coloca un MessageBox.Show ("1") justo antes del if, y un MessageBox.Show ("2") dentro del if, y un MessageBox.Show ("3") justo después del if, que de los tres MessageBoxes aparecen? –

3

Estoy experimentando este problema también, pero ligeramente diferente. Aquí está mi código:

 string lockCode = Guid.NewGuid().ToString(); 
     bool alreadyLocked = string.IsNullOrWhiteSpace(lockCode); 

     if (alreadyLocked) { 
      throw new Exception("already running"); 
     } 

     try { 
      PerformTask(task); 
     } 
     finally { 
      UnlockTask(task, lockCode); 
     } 

Como se puede ver, la cadena de código de bloqueo siempre se asigna con un valor GUID. El depurador entra en el ámbito 'si', aunque no debería. La excepción no se arroja.

Estoy ejecutando Visual Studio 2010 SP1 en Windows 7 de 64 bits con ReSharper 6.0.

Microsoft Visual Studio 2010 
Version 10.0.40219.1 SP1Rel 
Microsoft .NET Framework 
Version 4.0.30319 SP1Rel 
Installed Version: Premium 

Esto me sucede con una aplicación ASP.NET en framework 4.0. Intenté ejecutar el código de repro publicado aquí en un proyecto diferente en mi máquina, pero no pude reproducir el problema.

Además, he eliminado la copia de la sombra de caché para el .NET Framework en esta ruta:

C:\Users\username\AppData\Local\assembly 

He eliminado el directorio de símbolos VS2010 caché y los archivos temporales de ASP.NET. Reinicié mi computadora, limpié toda la solución y reconstruí todo. No hay idea de por qué sucede esto.

Solución alternativa: Si elimino la parte 'try-finally' del método o extraigo la sentencia throw en un método diferente, el depurador pasa correctamente por el ámbito 'if'.

Lo siento por no publicar una solución real a esto, espero que esto ayude a aislar el problema o solucionarlo.

+0

¡Gracias! Por lo menos, ha encontrado una solución temporal. –

1

Hoy también he experimentado este problema. El siguiente código soluciona el problema, con la ventaja de no compilar la solución alternativa en las versiones de lanzamiento:

using System; 

namespace IEnumerableBug2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (new object() == null) 
       throw new Exception(); 

      #if DEBUG 
      bool workaround = true; // dummy instruction 
      #endif 

      try { } catch { } 
     } 
    } 
} 
Cuestiones relacionadas