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).
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();
}
}
+1 cho vòng kết nối tự do – James
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
@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