2011-11-14 8 views
17

ブレークポイントAをコードのどこかに設定し、このブレークポイントにヒットしたときに手動で1つ以上のブレークポイントを有効にすることがよくあります。典型的なケースは、私がunittestをデバッグしているときで、前のテストについて気にしない場合です。ブレークポイントAがヒットした場合はブレークポイントBを有効にしてください

void testAddZeros() 
{ 
    Number a(0); 
    Number b(0); 
    Number result = a.add(b); 
    assert((a + b) == Number(0)) 
} 
void testAddOnes() 
{ 
    Number a(1); 
    Number b(1); 
    Number result = a.add(b); 
    assert((a + b) == Number(2)); 
} 
void testAddNegativeNumber() 
{ 
    Number a(1); 
    Number b(-1) 
    Number result = a.add(b); 
    assert((a + b) == Number(0)); 
} 

場合testAddZeros()testAddOnes()細かい動作しますが、testAddNegativeNumber()を想像してみてください。この場合、デバッグを開始するには、ブレークポイントをNumber result = a.add(b);に設定するのが自然です。エラーがNumber::addの深いどこかにあると想像してください。したがって、私たちは実際にはNumbers::addの早い段階で起こっていることに関わっていません。私がしたいのは、私がtestAddNegativeNumber()テストの中にいる場合にのみトリガーするNumbers::addの中のどこかにブレークポイントを設定することです。

ブレークポイントAがヒットした場合、ブレークポイントBを自動的に有効にする方法はありますか?

+1

条件付きブレークポイントを確認しましたか?おそらく、ブレークポイントAがヒットした条件を使用して '条件付き'ブレークポイントBを有効にすることができます(この場合、ブレークポイントAはもう必要ありません)。 – ChristiaanV

+0

@ChristiaanV:はい、私は条件付きブレークポイントはできませんこの場合、少なくとも一般的ではありません。 – larsmoa

+0

これを使用したいコードサンプルを表示できますか? – ChristiaanV

答えて

19

従属ブレークポイントを有効にするマーカーを保持するためにグローバルストレージを使用することで、コードを変更しなくても従属ブレークポイントを取得できます。

私が見つけた最もアクセスしやすいストレージの1つは、アプリケーションドメインのカスタムプロパティです。これらのメソッドには、System.AppDomain.CurrentDomain.GetDataメソッドとSetDataメソッドからアクセスできます。

breakpoint condition

{(真、 "ブレイク")System.AppDomain.CurrentDomain.SetData}

だから最初のブレークポイントであなたは "打ったとき" で設定を定義します

依存するブレークポイントで、ヒット条件を次のように設定します。

System.AppDomain.Current Domain.GetData( "break")!= null

+0

この種のものがトレースポイントで動作するかどうかは分かりましたが...今私は知っています。アップアップされました! – codekaizen

2

これは、あなたが実際にできなくなります

string breakpointToStopOn = string.Empty; 
Console.WriteLine("HERE"); // You can set breakpoint A here, 
          // with a condition (right click on the breakpoint, then selectCondition), 
          // that sets breakpointToStopOn = "A" 
Console.WriteLine("B"); // and you can set your breakpoint here with this condition 
         // (breakpointToStopOn == "A"); 

...私はあなたができると思うが、それは変数を加えることを含むので、それは、でもしようとするハックの大きすぎるようで最高についてですConsole.WriteLine( "HERE")行で停止することができますが、実際には他のブレークポイントを有効にするブレークポイントを有効または無効にすることができます。

ただし、条件付きブレークポイントステートメントは、デバッグ中にアプリケーションのパフォーマンスを著しく低下させます。

+0

これは私が探していたものではありませんが、これは最高の(唯一の)提案です。 – larsmoa

関連する問題