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

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

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

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

 

-

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

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

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

-

ツールバーの ボタンを有効にしている場合

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

 

備考

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

 

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

 

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

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

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

 

注意 1.

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

注意 2.

ステップ実行でスタンバイ・モード(HALT/STOP)に移行する命令を実行した場合,スタンバイ・モード命令以降の次命令で停止します。
また,使用するデバッグ・ツールによって,次のように動作が異なります。

-

【シミュレータ】以外
ステップ実行ではスタンバイ・モードに移行しません。

-

【シミュレータ】
ステップ実行でスタンバイ・モードに移行します。
スタンバイ・モードが解除されているように見えますが,スタンバイ・モードが解除されているか否かは,メイン・ウインドウのステータス・バー上のCPU状態で確認してください。

注意 3.

【シミュレータ】以外

ステップ実行中は,割り込みが禁止されます。また,フェイルセーフ・ブレーク【IECUBE】を発生しません。

注意 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)]に設定