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

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

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

なお,ステップ実行を行う際の実行単位は,次の設定に依存します。

 

-

エディタ パネルのツールバーの ボタンを無効にしている場合(デフォルト)

ソース・レベル単位によるステップ実行を行います。

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

 

-

エディタ パネルのツールバーの ボタンを有効にしている場合

命令レベル単位によるステップ実行を行います。

注意

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

 

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

 

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

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

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

注意 1.

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

注意 2.

関数のプロローグ/エピローグ処理中,および戻りアドレスが取得できない場合は,エラー・メッセージを表示します。

注意 3.

【Full-spec emulator】【E1】【E20】

-

ステップ実行中は,割り込みが禁止されます。

-

ステップ実行中は,スタンバイ・モードに移行しません。

注意 4.

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

注意 5.

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

以下のようなプログラムを記述した場合,生成コード上は(*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);
  }
}

なお,本注意は,ビルド・ツールのプロパティ パネルの[コンパイル・オプション]タブの以下のどちらか,または両方の設定で回避できる場合があります。

-

[デバッグ情報]カテゴリ内にある[最適化時のデバッグ情報強化を行う]プロパティを[はい(-g_line)]に設定

-

[最適化]カテゴリ内にある[最適化レベル]プロパティを[デバッグ優先(-Onothing)]に設定