下記のようにコンパイラの最適化で省略される個所にブレイクポイントを設定できないことがあります。
1 2 3 4 5 6 7 8 |
while (num_of_line > 0) { /* 中略 */ if (num_of_lines < 10) { continue; /* ここにブレイクポイントを設定できない */ } } |
解決方法
1 2 3 4 5 6 7 8 9 |
while (num_of_line > 0) { /* 中略 */ if (num_of_lines < 10) { asm volatile ("NOP"); /* ここ(NOPコマンド)にブレイクポイントを設定できる */ continue; } } |
上記のようにインライン・アセンブラでNOP(Non-Operation)コマンドを挿入することで強制的にブレイクポイントを設定できるコードを挿入します。
上記は GCC や IAR EmbeddedWorkbench の例ですが、多くのコンパイラでインライン・アセンブラの書式が用意されています。 volatile修飾子をつけないとコンパイラの最適化が働き、NOP が削除される場合があります。