MPLABX : Broken breakpoint

MPLABXでデバッグ実行していると割とよくあるケースで、ブレークが壊れて止まってくれないことがある。

Visual StudioでC++開発とかしている場合、Releaseモードでビルドしていたり、ソースとビルドモジュールの不一致などでは発生する。ただこのケースでは、そういったわけではないのだが、結構困っていた。

コード追加したり、減らしたり、位置を変えるとできたりする。下図では、L12行目だけ何故か壊れる。

mplabx_broken_breakpoint-1

そのときにOUTPUTメッセージにもL12についてエラーメッセージが表示される。

mplabx_broken_breakpoint2

これはプログラムが悪いわけではなく、XC8コンパイラの最適化がイケてないとのこと。
どうしても止めたい場所がある場合、ブログを調べていると解決策がって、asm("nop")を入れると確かに止まった。

res = 0;
res = 1;
asm("nop");
res = 2;

https://broadbeans.blog.ss-blog.jp/2014-01-24

ただこの解決策は、コードに手を入れることになるので、最後の手段として留めておくとする。コンパイラの最適化の問題ということなので、XC8の設定を見てみる。

設定前(L11、12がbroken, L13はOK)

mplabx_broken_breakpoint3

XC8コンパイラのデフォルトの設定(結果は上記)

mplabx_broken_breakpoint4

OptimizationのDEBUGをチェックONしてみたが、変化なし。

mplabx_broken_breakpoint4

つづいて、Local code generationをチェックONしたところ、効果ありでブレークが壊れなくなった

mplabx_broken_breakpoint4

ステップ実行してもちゃんと止まるようになった。偶然?と思って上記オプションをOFFすると、また壊れるので、多分この設定が効いていると思われる。

mplabx_broken_breakpoint4

ただ良いことばかりではなく想像はしていたが、プログラムやRAMのサイズが増えてしまう。

Local code generationをチェックOFFの状態でビルド

xc8_optimize_004

Local code generationをチェックONの状態でビルド

xc8_optimize_005

コード量に対して、どの程度比例するのかはわからないが、ギリギリ押し込んでいる場合だと辛いかもしれない。

あと、いつの間にか??XC8の無料版でもOptimization Levelで最適化の具合を変更できる。この数字を上げると、確かにプログラムサイズが圧縮できて、速さも期待できそう。もちろんLeveをゼロ以外にするとブレークは壊れるが仕方なし。