LoginSignup
6
2
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

ステップイン、ステップアウト、ステップオーバーの違い

Posted at

ステップイン、ステップアウト、ステップオーバーの違い

エンジニア初心者の時に上司に「デバックして動き確認しといて」と言われ、何もブレークポイントを置かずにただ画面上の動きを確認していました。
※ブレークポイントを置いた行で、強制的に処理を中断することが出来ます。

そこで初めて「ステップイン、ステップアウト、ステップオーバー」を知り、感動したことを覚えています。ただ、最初の頃はよくこの3つの違いが分からず、全部ステップインでデバックしていて、F11をとにかく連打していました。
(※Visual StudioではF11がステップインのキーとなります。)

その様子を見た上司は、「ゲームじゃないんだから、、」と呆れていましたね。
僕と同じ恥ずかしい思いをしてほしくなく、これからデバックを学ぶ人向けに書いていきます。

こちらの記事は当時参考にした以下の記事を元に書いています。
参考記事

前提として、以下のようなファイルを想定し、「main → parent → child」という順番で関数が動くような処理を行う状態です。

debug.js
//main関数がまず動く
function main() {
	console.log("main: start");
	//parent関数が動く
	parent();
	console.log("main: end");
}

function parent(){
	console.log("parent: start");
	//child関数が動く
	child(); //ここにブレークポイントを置いた場合
	console.log("parent: end");
}

function child(){
	console.log("child: start");
	console.log("child: end");
}

このファイルを元に「ステップイン、ステップアウト、ステップオーバー」の違いを解説していきます。関数parentの中にある関数childの行にブレークポイントを置いた場合、以下のような動きになります。

  • ステップイン:関数childの中に入り、関数childの1行目へ移動
  • ステップアウト:関数parentを抜け、関数mainの最終行へ移動
  • ステップオーバー:関数childの中に入らず、次の行へ移動

1つ1つ解説していきます。

ステップイン

debug.js
function main() {
	console.log("main: start");
	parent();
	console.log("main: end");
}

function parent(){
	console.log("parent: start");
	child(); //ここにブレークポイントを置いた場合
	console.log("parent: end");
}

function child(){
	console.log("child: start"); //ステップインだとここに移動
	console.log("child: end");
}

Step "In"なので、関数childの中に入っていきます。
次にフォーカスが当たるのが関数childの最初の行になります。

デバッガーは、呼び出された関数の最初の行でプログラムの実行を一時停止し、その関数内のコードをt調査できるようにします。

ステップアウト

debug.js
function main() {
	console.log("main: start");
	parent();
	console.log("main: end");//ステップアウトだとここに移動
}

function parent(){
	console.log("parent: start");
	child(); //ここにブレークポイントを置いた場合
	console.log("parent: end");
}

function child(){
	console.log("child: start");
	console.log("child: end");
}

Step "Out"なので、今いる関数の外に出ようとします。
次にフォーカスが当たるのが関数mainの最終行になります。

デバッガーは現在の関数を終了するまでプログラムの実行を継続します。

これにより、現在の関数の残りの行をスキップして、呼び出し元に戻ることができます。

ステップオーバー

debug.js
function main() {
	console.log("main: start");
	parent();
	console.log("main: end");
}

function parent(){
	console.log("parent: start");
	child(); //ここにブレークポイントを置いた場合
	console.log("parent: end");//ステップオーバーだとここに移動
}

function child(){
	console.log("child: start");
	console.log("child: end");
}

デバッガーはコードの現在の行を「スキップ」し、次の行で一時停止します。

Step "Over"なので、今いる関数を超えてジャンプするイメージです。

次にフォーカスが当たるのが関数parent内にある関数childの次の行になります。

まとめ

いかがだったでしょうか。

  • ステップイン:関数childの中に入り、関数childの1行目へ移動
  • ステップアウト:関数parentを抜け、関数mainの最終行へ移動
  • ステップオーバー:関数childの中に入らず、次の行へ移動

デバッグ処理は、プログラム最適化、開発時間の短縮、信頼性向上、メンテナンス容易性の観点から、ソフトウェア開発において重要であり、品質向上と効率化を促進します。

ステップ処理をマスターして、つよつよエンジニアへ近づいていきましょう。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2