2011-12-29 28 views
16

Tôi đang gặp một vấn đề rất kỳ lạ với các biến cục bộ nằm ngoài ngữ cảnh trong trình gỡ lỗi Visual Studio 2010 cho ứng dụng giao diện điều khiển C# nhắm mục tiêu .NET 4.0. Tôi đã tìm kiếm các câu hỏi tương tự khác trên SO, nhưng trong khi một số có các triệu chứng tương tự, không ai có vẻ áp dụng trực tiếp cho vấn đề này (tất cả chúng dường như có nguyên nhân gốc rễ khác).Trong số các biến bối cảnh Trong Visual Studio 2010 Debugger

Vấn đề là đối với một số biến (nhưng không phải tất cả) Tôi không nhận được chú giải công cụ với giá trị của chúng, chúng không xuất hiện trong cửa sổ Người dân địa phương và tôi nhận được "Tên 'xyz' không tồn tại trong hiện tại ngữ cảnh "nếu tôi thêm chúng vào cửa sổ Xem. Nó dường như ảnh hưởng đến một số biến nhưng không ảnh hưởng đến một số biến, và tôi không thể tìm ra một mẫu (nó dường như không dựa trên thành viên so với local, class so với struct, hoặc bất kỳ khác biệt nào khác). Tôi đã khởi động lại máy tính của mình và Visual Studio, đã xác minh tôi đang ở trong bản dựng Gỡ lỗi sạch, đảm bảo khung gỡ lỗi chính xác, đảm bảo làm mới các biến trong màn hình đồng hồ và thử nhiều phép thuật và câu thần chú khác nhau.

Tôi đã bao gồm chia sẻ màn hình bên dưới (phiên bản lớn hơn tại http://i.stack.imgur.com/JTFBT.png).

enter image description here

Bạn nghĩ gì?

EDIT:

Thêm một số thông tin bổ sung:

Vấn đề là lặp lại. Các biến tương tự chính xác hoặc hoạt động hoặc không hoạt động, ngay cả sau khi tắt hoàn toàn và khởi động lại Visual Studio. Điều này khiến tôi tin rằng thực sự có điều gì đó có hệ thống đi sai thay vì chỉ là tham nhũng của bộ nhớ hay gì đó.

Tôi cũng đã phát hiện ra rằng dường như có liên quan đến khối try-catch. Nếu tôi định vị điểm ngắt ngoài câu lệnh thử, tôi có thể thấy bất kỳ biến trong phạm vi nào bình thường. Ngay sau khi điểm thực thi nhập vào câu lệnh try, tất cả các biến bên ngoài khối try trở thành không thể tiếp cận và tôi chỉ có thể truy cập vào các biến bên trong câu lệnh try. Nó gần như là trình gỡ lỗi đang xử lý khối thử như một phương thức riêng biệt (mặc dù bạn có thể thấy mã/trình biên dịch vẫn có quyền truy cập vào các biến trong phạm vi). Có ai nhìn thấy hành vi này trước đây không?

KHÁC EDIT:

I (một phần) lấy lại những gì tôi đã nói về try-catch là nghi ngờ - có vẻ như trong phần này của mã các cuộc triển lãm debugger thứ lấy lẻ này ra khỏi bối cảnh cho bất kỳ kèm theo khối. Ví dụ, nếu tôi đặt một điểm ngắt trực tiếp bên trong câu lệnh foreach trong ảnh chụp màn hình, tôi có thể thấy giá trị biến "cổng" trên mỗi lần lặp, nhưng không có biến nào ngoài câu lệnh foreach (biến mất ngay khi tôi vào khối foreach) . Sau đó, ngay khi bạn nhập khối thử, biến "cổng" đột nhiên biến mất. Điều này thật là kỳ lạ.

Ngoài ra, theo yêu cầu, mã cho toàn bộ phương thức ở bên dưới.

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(); 
    } 
} 
+13

+1 cho vòng kết nối tự do – James

+1

Kiểm tra thuộc tính dự án của bạn: bạn có chắc cấu hình gỡ lỗi của mình chưa được thay đổi thành "tối ưu hóa mã" không? – phoog

+0

@phoog Cảm ơn bạn đã đề xuất. Tôi vừa kiểm tra các thuộc tính của dự án và "Tối ưu hóa mã" được bỏ chọn. Đã cài đặt – daveaglick

Trả lời

8

Vì vậy, nó chỉ ra điều này liên quan đến lỗi trong PostSharp. Tôi đã sử dụng PostSharp nhưng đã xóa tất cả các khía cạnh khỏi mã của mình và đảm bảo rằng không có ứng dụng nào được áp dụng. Tôi cũng đã xác nhận với Reflector rằng các phương thức vẫn còn nguyên vẹn trong assembly. Tuy nhiên, nó xuất hiện chỉ đơn giản là tham chiếu PostSharp kích hoạt một số loại thao tác của các biểu tượng gỡ lỗi gây ra vấn đề này.A (ít) biết thêm chi tiết có thể được tìm thấy ở đây:

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

Ngoài ra, trong các ghi chú phát hành cho các tiểu bang PostSharp hotfix mới nhất một trong những vấn đề cố định trong hotfix 2.1.5.6 là "biểu tượng Debugging: những biểu tượng biến cục bộ bị mất trong vòng lặp ngầm tiềm ẩn. "

Khi tôi cài đặt PostSharp mới nhất và lớn nhất, sự cố đã biến mất và vũ trụ trở lại bình thường. Hy vọng rằng câu hỏi/câu trả lời này sẽ giúp bất kỳ ai khác sử dụng PostSharp, những người tình cờ gặp phải hành vi kỳ lạ này trước khi phát hành chính thức sau PostSharp. Hãy chắc chắn rằng bạn đang ở trên hotfix 2.1.5.6 hoặc cao hơn (do mức độ nghiêm trọng của lỗi, điều này có lẽ nên có được một bản phát hành thực tế).

Cảm ơn tất cả mọi người đã giúp đỡ.

+1

tốt để biết ... và vui mừng rằng nó không phải là một lỗi trong VS 2010 – Yahia

Các vấn đề liên quan