c# visual-studio visual-studio-2010 debugging

c# - Variables fuera de contexto en el depurador de Visual Studio 2010



visual-studio visual-studio-2010 (1)

Resulta que esto está relacionado con un error en PostSharp. Había estado usando PostSharp pero eliminé todos los aspectos de mi código y me aseguré de que no se aplicara ninguno. También verifiqué con Reflector que los métodos estaban intactos en el ensamblaje. Sin embargo, parece que simplemente hacer referencia a PostSharp desencadena algún tipo de manipulación de los símbolos de depuración que causa este problema. A (un poco) más información se puede encontrar aquí:

http://www.sharpcrafters.com/forum/Topic5794-21-1.aspx#bm7927

Además, en las notas de la versión de la última revisión PostSharp, uno de los problemas resueltos en la revisión 2.1.5.6 es "Símbolos de depuración: símbolos de variables locales perdidos en los iteradores implícitos".

Cuando instalé la última y mejor PostSharp, el problema desapareció y el universo volvió a la normalidad. Esperamos que esta pregunta / respuesta ayude a cualquier otra persona que use PostSharp que se tropiece con este extraño comportamiento antes del próximo lanzamiento oficial de PostSharp. Asegúrese de que está en la revisión 2.1.5.6 o superior (dada la gravedad del error, esto probablemente debería haber sido una versión real).

Gracias a todos por la ayuda.

Estoy teniendo un problema muy extraño con las variables locales que están fuera de contexto en el depurador de Visual Studio 2010 para una aplicación de consola C # orientada a .NET 4.0. He buscado otras preguntas similares sobre el SO, pero aunque algunos tienen los mismos síntomas, ninguno parece aplicarse directamente a este problema (todos parecen tener otras causas).

El problema es que para algunas variables (pero no todas) no obtengo información sobre herramientas con su valor, no aparecen en la ventana Locales, y aparece "El nombre ''xyz'' no existe en el contexto actual" si Agrégalos a la ventana de vigilancia. Parece que afecta a algunas variables pero no a otras, y no puedo entender un patrón (no parece estar basado en miembro vs. local, clase vs. estructura, o cualquier otro diferenciador). Reinicié mi computadora y Visual Studio, verifiqué que estaba en una compilación de depuración limpia, me aseguré de que el marco de depuración fuera correcto, me aseguré de actualizar las variables en la pantalla de observación e intenté varios hechizos y conjuros.

He incluido una captura de pantalla a continuación (versión más grande en http://i.stack.imgur.com/JTFBT.png ).

¿Alguna idea?

EDITAR:

Añadiendo alguna información adicional:

El problema es repetible. Las mismas variables exactas funcionan o no funcionan, incluso después de cerrar y reiniciar completamente Visual Studio. Esto me lleva a creer que realmente hay algo sistemático que va mal en lugar de solo corrupción de memoria o algo así.

También descubrí que parece estar relacionado con el bloque try-catch. Si posiciono el punto de interrupción fuera de la instrucción try, puedo ver cualquiera de las variables dentro del alcance normalmente. Tan pronto como el punto de ejecución ingresa a la instrucción try, todas las variables fuera del bloque try se vuelven inaccesibles y solo puedo acceder a las que están dentro de la instrucción try. Es casi como si el depurador tratara el bloque try como un método separado (aunque puede ver que el código / compilador todavía tiene acceso a las variables dentro del alcance). ¿Alguien ha visto este comportamiento antes?

Otra edición:

Retiro (parcialmente) lo que dije acerca de que el intento-captura es sospechoso: parece que en esta parte del código el depurador exhibe estas cosas extrañas fuera de contexto para cualquier bloque adjunto. Por ejemplo, si configuro un punto de interrupción directamente dentro de la instrucción foreach en la captura de pantalla puedo ver el valor de la variable "puerto" en cada iteración, pero ninguna de las variables fuera de la instrucción foreach (que desaparecen tan pronto como entro en el bloque foreach) . Luego, tan pronto como ingresa al bloque try, la variable "puerto" desaparece repentinamente. Esto se está poniendo realmente raro.

Además, según lo solicitado, el código para el método completo se encuentra a continuación.

private void ConfigureAnnouncerSockets(XDocument configDocument) { XElement socketsElement = configDocument.XPathSelectElement("/Configuration/Network/AnnouncerSockets"); bool useDefault = true; if (socketsElement != null) { //Use the default announcers? (they will be added at the end) XAttribute defaultAttribute = socketsElement.Attribute("useDefault"); if (defaultAttribute != null) { useDefault = Convert.ToBoolean(defaultAttribute); } //Get the default frequency int defaultFrequency = Announcer.DefaultFrequency; XAttribute frequencyAttribute = socketsElement.Attribute("frequency"); if (frequencyAttribute != null) { defaultFrequency = Convert.ToInt32(frequencyAttribute.Value); } //Get all sockets foreach (XElement socketElement in socketsElement.XPathSelectElements("./Socket")) { //Get the address IPAddress address = IPAddress.Broadcast; string addressAttribute = (string)socketElement.Attribute("address"); if(!GetAddress(addressAttribute, ref address, true)) { Intelliplex.Log.Warn("Invalid announcer socket address: " + addressAttribute); continue; } //Get the local address IPAddress localAddress = null; string localAddressAttribute = (string)socketElement.Attribute("localAddress"); if(!GetAddress(localAddressAttribute, ref localAddress, false)) { Intelliplex.Log.Warn("Invalid announcer socket local address: " + localAddressAttribute); continue; } //Get the port(s) List<int> ports = new List<int>(); string[] ranges = ((string)socketElement.Attribute("port")).Split(new[] { '','' }); foreach (string range in ranges) { string[] portPair = range.Split(new[] { ''-'' }); int firstPort = Convert.ToInt32(portPair[0]); int lastPort = portPair.Length > 1 ? Convert.ToInt32(portPair[1]) : firstPort; do { ports.Add(firstPort); } while (++firstPort <= lastPort); } //Get the local port int localPort = socketElement.Attribute("localPort") != null ? Convert.ToInt32((string)socketElement.Attribute("localPort")) : 0; //Get the frequency int frequency = socketElement.Attribute("frequency") != null ? Convert.ToInt32((string)socketElement.Attribute("frequency")) : defaultFrequency; //Create the socket(s) and add it/them to the manager foreach (int port in ports) { try { IPEndPoint endPoint = new IPEndPoint(address, port); IPEndPoint localEndPoint = localAddress == null ? new IPEndPoint(IPAddress.Any, 0) : new IPEndPoint(localAddress, localPort); Announcer socket = new Announcer(frequency, endPoint, localEndPoint); AnnouncerSockets.Add(socket); } catch (Exception ex) { Intelliplex.Log.Warn("Could not add announcer socket: " + ex.Message); } } } } //Add default announcement sockets? if (useDefault) { ConfigureDefaultAnnouncerSockets(); } }