お世話になります。SYOUです。
RX62Tでソフトを作っていて、作成したコードにアドレスが割り当てられず、ブレークポイントを置けなくて困っているので投稿させてもらいます。(開発環境はCS+になります)
下に簡単に関数を書いたのですがこの関数をCS+でビルドしてみたところPos=i;のところにアドレスが表示されず、ブレークポイントが設置できません。
関数の内容をほかのところに直接書いた場合にはアドレスも表示され、ブレークポイントの設定もできました。
似たような状況になったことのある方いらっしゃいましたらお知恵をお借りしたいです。
void f(uint_16 j ,uint_8 k ,uint_32 Pos ){
uint_16 i;
for(m=0; j<10; m++){
if( (box[ m ]==j) && (k==1) ){
Pos = i;
}
すみません。ポカをやってしまいましたので消しました。大変申し訳ありません。
デバッガーで何をデバッグするのかを明確にした方が良いと思われます。皆さんがデバッガーに期待するものに少し興味があります。
メモリーや実行時間の節約はコンパイラーに任せて、設計書を満たす安全性や移植性や検証性が高いソースコードが第一です。
最適化ありとなしで同じ結果が得られることは大前提です。あまり考えずに、低コストのためにリリース用およびテスト用は最適化ありで、ソースコードと対応させるためにデバッグ用は最適化なしで良いと思います。
最適化ありとなしで同じ結果が得られることは理想ですが実際そうとも限らないのでデバグも最適化ありで行うのが望ましいと思います。
最適化なしでビルドした場合にはコンパイラが警告しない変数未初期化のバグや無意味なコードの削除など、最適化ありでは不具合の発見に役立つことも多いです。
CやC++のコンパイラはプロ用の道具であり書いたソースから出力されるコードが想像できないレベルでは使用すべきツールではないとも思います。
CC-RX使ってます。最適化の有無で速度は雲泥の差です(定量的な比較はあえて避けます)。CAのRL78なんかは最適化してもほとんど速くならないですね。
プログラムの修正が許されて、ピンポイントで止めたいところが分かってるなら、nop() 関数を入れて、そこにブレーク置きます。ほとんどこれでいけます。-schedule のオプションつけると、ステップ実行は厳しいですね。
最適化する/しない については、最適化しないとCPU時間足らない場合は、選択肢無いですよね。-schedulerだけやめて動いてくれれば、少しだけステップで追えたりします。ロカール変数のウォッチできないのも辛かったりしますね。
(投稿後、行間修正しました)
このスレッドの始まりがソースレベルデバッグでしたので無意識的に書き忘れてしまいましたが、
ソースレベルデバッグと双璧を成すもう1つのデバッグ方法としてprintfデバッグがありますね。
通常、printfデバッグしか使えない時には、わざわざ最適化無しに切り替えることはしないですね。
(ソースレベルデバッグと併用する時は横着(?)して最適化無しのまますることも私はありますが。)
私はWindowsで当たり前にC/C++ソースレベルデバッグが行われていた頃にプログラミングを
学んだので、デバッグと聞くと『パブロフの犬』的にソースレベルデバッグをイメージしてしまいます。
(Arduinoやmbedを触ることもありますのでprintfデバッグもするのですが、どうにもこうにも、
デバッグのデフォルトとしてはソースレベルデバッグをイメージしてしまいます。) ちなみに、
ArduinoもmbedもC++ですね。(Arduinoは少し味付けされていますが。) というか、マイコンの
値段のことまでそれなりに考慮に入れる場合は、今でもC/C++以外に選択肢がないですよね、、、