5

デバッグ時にif文の条件が満たされたときに停止する方法は? 例えば:

if (!check()) {
  int a = 0;
}

int a = 0; はダミーコードで、そこにブレークポイントを置きます。空の if ループ内にブレークポイントを配置すると、デバッガーはそこで停止せず、実行可能な命令でのみ停止します。int a; をしても。やめない宣言だけ。

ダミーコードを書く以外の方法でこれを行うことはできますか?

ありがとう

4

2 に答える 2

10

ダミーコードを書く以外の方法でこれを行うことはできますか?

はい!

デバッガーでは、ブレークポイントを追加して、特定の条件が満たされたときにのみブレークするように設定できる必要があります。これを行う方法は IDE によって異なりますが、コード エディターのガターまたは別の [ブレークポイント] ウィンドウでブレークポイントを右クリックし、ポップアップ メニューから [プロパティ] を選択します。次に、次のダイアログが表示されます。

条件が設定されたブレークポイント プロパティ ダイアログ

コードがそのブレークポイントに到達するたびに評価される 'Condition' プロパティを設定したことがわかりますが、ブレークポイントは条件が の場合にのみブレークしますtrue。つまり、すべてが OK のときに return すると、 return のときに壊れcheck()ます。true!check()check()false

通常、このような式を評価するには、デバッガーが (内部的に) 中断して何かを評価する必要があるため、このメソッドが頻繁に呼び出されると、プログラムの速度が少し遅くなる傾向があります。しかし、それはきちんとした機能です。設定できる他のすべてのプロパティにも注意してください。[詳細設定] ボタンをクリックした後にダイアログがどのように見えるかさえわかりません...

他の質問に答えるには:

空の if ループ内にブレークポイントを配置すると、デバッガーはそこで停止せず、実行可能な命令でのみ停止します。int a; をしても。やめない宣言だけ。

if ブロック (ループではない) が空の場合、停止するものはありません。実際のコードでのみ停止できます。 int a;単なる変数宣言です。単純型の場合、実際にはコードは生成されません。(ただし、たとえば、コンストラクターを呼び出すため、より複雑な型のMyClass a;場合もあります。) もう少しコードを記述したとしても、次のようになります。

if (!check()) {
  int a;
  a = 5;
  b = a;
}

コードが実際には何もしないことがわかる可能性があるため、コンパイラはまだこのためのコードを生成しない可能性があります。これは、最適化設定にある程度依存しますが、特定の最適化設定がまったくなくても、一部のコンパイラは最適化を解除します。

さまざまな理由 (条件評価の速度だけの場合もあります) により、IDE を使用するよりもコードを中断する方が便利な場合があります。この状況では、関数呼び出しを使用して中断する傾向があります。関数はプログラムの状態を変更せず、最適化することはできません。

if (!check()) {
  rand(); // <- breakpoint here
}

ただし、通常は、IDE とデバッガーの機能を十分に活用することをお勧めします。

編集:これは支持されているので(ありがとうございます)、完全を期すために別のアプローチを追加すると思いました。ソフトウェア/デバッガー ブレークポイントは、デバッガーによってパッチされる割り込み 3 で発生します。 アセンブリ命令は 1 バイトのint 3長さしかないため、他の命令にパッチを適用できます。プログラムが中断した場合、古い命令を一時的に元に戻すことができます。ただし、デバッガーがこれをオンザフライで実行するのと同様に、コードで実行することもできます。

つまり、次のような方法で、プログラムを強制的にコードに割り込ませることができます (デバッガーによってキャッチされます。デバッガーの下で実行していない場合は、問題が発生する可能性があります。通常、プログラムは中止されます)。構文は環境によって異なります。

if (!check()) {
  __asm int 3
}

または、環境に依存するコードを避けて、多くの C++ コンパイラには組み込み関数またはマクロがあり、次のようにDebugBreak();使用__debugbreakできます。

if (!check()) {
  DebugBreak();
}

デバッガーでプログラムを実行すると、その行で実行が中断されることがわかります。

これを通常に使用する理由はほとんどありません。私が見たのは、アサーションが失敗したときにデバッガーに割り込むカスタム アサート ハンドラーですが、その後も実行を続行できるようにするものです。

于 2013-07-10T10:04:33.357 に答える
0

アサーションを使用します。デバッグ時のエラーチェック用に作られています。条件が false (ゼロに等しい) の場合、実行はそこですぐに停止します。

于 2013-07-10T09:49:57.087 に答える