Everything
2.9.3 プログラムをステップ実行する

次のいずれかの操作を行うと,現在のアドレス(カレントPC値で示されるアドレス)から,ソース・レベル単位(ソース・テキスト1行分),または命令レベル単位(1命令分)でプログラムをステップ実行したのち,自動的に停止します。

プログラムの停止後は逐一各パネルの内容が自動的に更新されるため,ステップ実行は,プログラムの実行遷移をソース・レベル単位/命令単位でデバッグする場合に有効な実行方法です。

なお,ステップ実行を行う際の実行単位は,次に示すようにエディタ パネルにおける設定に依存します。

-

ツールバーの ボタンを無効にしている場合(デフォルト)
ソース・レベル単位によるステップ実行を行います。
ただし,逆アセンブル パネルにフォーカスがある場合,またはカレントPC値で示されるアドレスに行情報が存在しない場合は,命令レベル単位によるステップ実行を行います。

-

ツールバーの ボタンを有効にしている場合
命令レベル単位によるステップ実行を行います。

備考

ボタンは,エディタ パネルを混合表示モードに設定している場合のみ有効となります。

 

ステップ実行には,次の種類があります。

 

2.9.3.1 関数内にステップ・インする(ステップ・イン実行)

2.9.3.2 関数をステップ・オーバーする(ステップ・オーバー実行)

2.9.3.3 関数内でリターンが完了するまで実行する(リターン・アウト実行)

 

注意 1.

ステップ実行中は,設定されているブレークポイント/ブレーク・イベント/Printfイベントを発生しません。

注意 2.

【シミュレータ】
ステップ実行中に割り込みハンドラにジャンプすることがあります。

注意 3.

ソース・レベル単位でステップ実行した場合,実行しないはずの行を実行しているように見える場合があります。
これはコンパイラの生成したデバッグ情報と生成コードとのずれによる現象であり,コンパイラの生成したコードの実行結果には問題ありません。

以下のようなプログラムを記述した場合,生成コード上は(*1)を実行していませんが,(*2)の後(*1)の位置へカレントPC位置が移動してしまうように見えます。

void main(void);
int x, y, z1, z2, z3;
void func(int i)
{
    if (i == 0) {
        ++x; // <-(*1)
        ++z1;++z2;++z3;
    } else {
        ++y; // <-(*2)
        ++z1;++z2;++z3;
    }
}
int one = 1;
void main(void)
{
  while (1)
  {
    func(one);
  }
}

なお,本注意は,ビルド・ツールのプロパティ パネルの[コンパイル・オプション]タブ→[最適化]カテゴリ内にある[最適化レベル]プロパティを[0 (-optimize=0)]に設定すると回避できる場合があります。