検索
連載

VS Codeを使ってPythonコードをデバッグするための基礎知識Visual Studio Codeで快適Pythonライフ(2/2 ページ)

[実行とデバッグ]ビュー、デバッグ用ツールバー、ステップ実行など、VS CodeでPythonコードをデバッグする上での基本知識を紹介。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

デバッグ実行をしてみる

 それではこの状態で[実行とデバッグ]ボタンをクリックして([Python File]構成を選択して)みましょう(または[F5]キーを押します)。すると、今度はプログラムが最後まで実行されることなく、以下のようにプログラムの実行が中断されます。

プログラムの実行が中断したところ
プログラムの実行が中断したところ

 [実行とデバッグ]ビューの表示、ステータスバーの色などが大きく変わりましたが、その説明の前に、エディタを見てください。

現在、実行が中断している行が強調して表示されている
現在、実行が中断している行が強調して表示されている

 先ほどブレークポイントを設定した行の背景色が黄色に変わって、ブレークポイントを示す丸を囲むように矢印が描かれています(VS Codeの設定でその色や異なるかもしれません)。これは、現在、この行を実行する直前でプログラムが中断していることを示しています。

 上部にはアイコンが並んだデバッグ用のツールバーが表示されています。

デバッグ用のツールバー
デバッグ用のツールバー

 このツールバーは中断したプログラムの実行をどのように進めるかを制御するもので、左から順に以下のようなボタンになっています。ツールバーのボタンには対応するショートカットキーがあるので、覚えておくと、ステップ実行のときにマウスに手を伸ばす必要がなくなるので、覚えておくことをお勧めします。

  • [続行]ボタン:プログラムの実行を続ける。[F5]キーが対応
  • [ステップオーバー]ボタン:現在の行を実行して、次の行の実行に移る前で中断する。[F10]キーが対応
  • [ステップインする]ボタン:現在の行を実行するが、その行に(ソースコードがあり、コードのチェックが可能な)関数の呼び出しが含まれている場合はその関数の先頭行に実行を進めて、プログラムを中断する。[F11]キーが対応
  • [ステップオーバー]ボタン:中断している関数のコードを最後まで実行して、呼び出し元に実行が戻った状態でプログラムを中断する。[Shift]+[F11]キーが対応
  • [再起動]ボタン:プログラムの実行をやり直す。Windows/Linuxでは[Ctrl]+[Shift]+[F5]キーが、macOSでは[Shift]+[Command]+[F5]キーが対応
  • [停止]ボタン:プログラムのデバッグ実行を終了する。[Shift]+[F5]キーが対応

 変数の値などを確認し、プログラムをワンステップ実行して、変数の値などを確認し、プログラムをワンステップ実行して……というのを繰り返すことから、こうした実行の仕方を「ステップ実行」と呼びます。

 そして、[実行とデバッグ]ビューの表示は次のように変わりました。

[実行とデバッグ]ビュー
[実行とデバッグ]ビュー

 ここには、現在実行しているスコープに存在する変数の値を調べる[変数]セクション、プログラマーが何らかの値を確認するのに使える[ウォッチ式]セクション、どのような経路(関数やメソッドの呼び出しの連鎖)で現在中断している箇所までプログラムの実行が進んだかを示す[コールスタック]セクション、先ほど話に出てきた[ブレークポイント]セクションがあります。

 これらのツールやその他の機能を使って、プログラムの動作をチェックすることがVS Codeにおけるデバッグ実行の基本となります。

ステップ実行をしてみる

 ここでは[ステップインする]ボタン(下向き矢印に「・」があるボタン)をクリックしてみましょう([F11]キーを押しても同じです)。

[ステップインする]ボタンをクリック
[ステップインする]ボタンをクリック

 この行ではprint関数の引数(f文字列)の中でfib関数が呼び出されていることに注意してください。そのため、ステップインにより、エディタ領域ではfib関数が定義されているmymath.pyファイルがアクティブになって、関数本体の先頭行で実行が中断されます。

ステップインにより実行はmymath.pyファイルで定義されているfib関数に移った
ステップインにより実行はmymath.pyファイルで定義されているfib関数に移った

 [実行とでバッグ]ビューの[変数]セクションからは、「fib(10)」呼び出しにより、パラメーターnに渡された整数値10が渡されていることが分かります(エディタでnにカーソルを合わせても「10」と表示されます)。

[変数]セクションには「fib(10)」呼び出しにより、パラメーターnに渡された値が10であることが表示される
[変数]セクションには「fib(10)」呼び出しにより、パラメーターnに渡された値が10であることが表示される

 現在はfib関数本体の1行目のif文が実行される直前でプログラムの実行が中断しています。ここで今度はステップオーバー(現在の行を実行)してみるとどうなるでしょう。[ステップオーバー]ボタンをクリックしてみてください(または[F10]キーを押しても同じです)。

ステップオーバーによりif文が実行され、条件が偽だったので次のif文に実行が移った
ステップオーバーによりif文が実行され、条件が偽だったので次のif文に実行が移った

 パラメーターnに渡された値は10だったので、このif文の条件である「n == 0」は成立しません。そのため、次のif文に実行が移りました。このif文の条件も偽となるので、もう一度ステップオーバーすると、最後のreturn文に移動します。この状態で今度は[ステップインする]ボタンをクリックしてみます。

ステップインにより、fib関数の先頭にもう一度実行が移った
ステップインにより、fib関数の先頭にもう一度実行が移った

 すると、実行はfib関数の先頭に戻ってきました。これは、return文で呼び出し元に返す値の計算式が「fib(n - 2) + fib(n - 1)」となっているからです。fib関数の最後のreturn文では、自分自身を二度呼び出しています。そして、まずはパラメーターnの値から2を減算した値を引数として1つ目のfib関数呼び出しが行われたのが現在の状況です。そのため、[実行とデバッグ]ビューの[変数]セクションではnの値が「8」になっています。

 このことは[実行とデバッグ]ビューの[コールスタック]セクションを見ても分かります。main.pyファイルからmain関数が呼び出されて、そこからfib関数が呼び出されて、さらにfib関数が呼び出されていることがしっかりと表示されています。

[コールスタック]セクション
[コールスタック]セクション

 ということは、ここでステップオーバーを2回(2つのif文)、ステップインを1回(最後のreturn文)実行すると、またfib関数が呼び出されるということです。そこまでの動作の確認はしませんが、このfib関数は自分自身を何度も何度も呼び出すことでフィボナッチ数を計算することが分かります。

 今度は、[ステップアウト]ボタンをクリックするか、[Shift]+[F11]キーを押してみましょう。これにより、現在のfib関数の実行が終わり、その呼び出し元に実行の制御が戻されます。

ステップオーバーにより呼び出し元に実行の制御が戻った
ステップオーバーにより呼び出し元に実行の制御が戻った

 現在は最初のfib関数で最後のreturn文にある1つ目のfib関数呼び出しが終わったところです。[変数]セクションを見ると、その戻り値が21であることが分かります。

 ここでステップインをすると、今度は10から1を減算した値である9を引数として、またfib関数が呼び出されることを確認できるはずです。が、ここではそれを行わずにステップアウトしてしまいましょう。

ステップアウトにより、「fib(10)」呼び出しが終了して、print関数呼び出しに実行が戻ってきた
ステップアウトにより、「fib(10)」呼び出しが終了して、print関数呼び出しに実行が戻ってきた

 これにより、fib関数呼び出しを含んだprint関数呼び出しに戻ってきました。ここで[変数]セクションを見ると、fib関数の戻り値が「55」になったことが分かります。しかし、まだprint関数呼び出し自体は実行されていません。そのため、デバッグ用に開かれたターミナルにも出力がされていません。ここでステップオーバーをすると、ターミナルには「result of fib(10): 55」と出力され、次の行に実行が移るはずです。

 そして、最後に[続行]ボタンをクリックすれば(または[F5]キーを押せば)、実行が次のブレークポイントまで続けられます。ここではブレークポイントはもうないので、プログラムの実行が終了して、デバッグ実行も停止します。

 このように、プログラムコードを少しずつ実行しながら、そこで扱われているデータ(変数)の値や呼び出しの履歴(コールスタック)などを確認することで、プログラムの振る舞いを確認し、問題があれば、コードを修正していくのがデバッグの基本となります。


 今回はVS Codeが持つデバッグ機能の基本的な部分を見ました。次回は今回説明できていない機能について取り上げます。

「Visual Studio Codeで快適Pythonライフ」のインデックス

Visual Studio Codeで快適Pythonライフ

Copyright© Digital Advantage Corp. All Rights Reserved.

前のページへ |       
[an error occurred while processing this directive]