2011-12-29 3 views
16

.NET 4.0を対象とするC#コンソールアプリケーション用のVisual Studio 2010デバッガのコンテキスト外のローカル変数に非常に奇妙な問題があります。私は他の同様の質問を探しましたが、同じ症状が出るものもありますが、この問題に直接当てはまるものはありません(彼らはすべて他の根本原因を持っているようです)。Visual Studio 2010デバッガでコンテキスト変数が不足しています

問題は、(すべてではないが)私はその値でツールチップを取得せず、ローカルウィンドウに表示されず、「現在の名前に「xyz」という名前が存在しないウォッチウィンドウに追加する場合は「コンテキスト」を選択します。それはいくつかの変数に影響するようですが、他の変数には影響しないと思われます。パターンを理解することはできません(メンバ対ローカル、クラス対構造体、またはその他の微分子に基づいているようには見えません)。私は自分のコンピュータとVisual Studioを再起動し、きれいなデバッグビルドであることを確認し、デバッグフレームが正しいことを確認し、ウォッチ画面の変数を更新して、さまざまな呪文や呪文を試みました。

下記のスクリーンショットを追加しました(より大きなバージョンはhttp://i.stack.imgur.com/JTFBT.pngです)。

enter image description here

任意の考え?

EDIT:

いくつかの追加情報を追加:

問題が再現可能です。 Visual Studioを完全にシャットダウンして再起動しても、まったく同じ変数が動作するか動作しません。これは私に、実際には記憶腐敗や何かではなく、体系的なものが実際にあると信じるようになります。

また、try-catchブロックに関連しているように見えます。 try文の外側にブレークポイントを配置すると、スコープ内の変数のいずれかが正常に表示されます。実行ポイントがtryステートメントに入ると、tryブロック以外の変数はすべてアクセスできなくなり、tryステートメント内の変数にしかアクセスできなくなります。デバッガがtryブロックを別のメソッドとして扱っているかのようです(ただし、コード/コンパイラにはスコープ内変数へのアクセス権があります)。誰もこの行動を以前に見たことがありますか?

ANOTHER EDIT:

私は(部分的に)私はのtry-catchが容疑者であることについて言ったことを取り戻す - それは、任意の外側のコンテキストのうち、コードデバッガの展示のこの部分では、この奇妙な撮影のものと思われますブロック。たとえば、スクリーンショット内のforeach文の中にブレークポイントを直接設定すると、各繰り返しで "port"変数の値を見ることができますが、foreach文の外の変数は(foreachブロックに入るとすぐに消えます) 。 tryブロックに入るとすぐに、 "port"変数が突然消えます。これは本当に変です。

また、要求どおり、メソッド全体のコードは次のとおりです。

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フリーハンドサークル – James

+1

プロジェクトのプロパティを確認してください:あなたのデバッグ設定が「最適化コード」に変更されていませんか? – phoog

+0

@phoog提案していただきありがとうございます。プロジェクトのプロパティを確認したところ、「コードの最適化」はチェックされていません。 – daveaglick

答えて

8

だから、これはPostSharpのバグに関連していることが判明しました。私はPostSharpを使用していましたが、私のコードからすべての側面を削除し、どれも適用されていないことを確認しました。私はリフレクターと一緒に、その方法がアセンブリで無傷であることを確認しました。しかし、単にPostSharpを参照すると、この問題の原因となるデバッグシンボルの何らかの操作がトリガされるように見えます。(少し)より多くの情報はここで見つけることができます:

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

、修正プログラム2.1.5.6で修正された問題の一つは、「デバッグシンボルである最新のPostSharpの修正プログラムの状態については、リリースノートで:ローカル変数のシンボル暗黙のイテレータで失われてしまった。

最新かつ最高のPostSharpをインストールしたときに問題が解消し、宇宙が正常に戻った。うまくいけば、この質問/回答はPostSharpを使用している誰かを助け、次の公式のPostSharpリリースの前にこの奇妙な行動に遭遇するでしょう。あなたが修正プログラム2.1.5.6以上であることを確認してください(バグの重大度を考えれば、実際のリリースであったはずです)。

ありがとうございました。

+1

知っておきたいことは... VS 2010のバグではないことを嬉しく思います – Yahia

関連する問題