閉じる

Jupyter/Colabでエラー直後にデバッガを起動する方法(%debug)

Jupyter NotebookやGoogle Colabでは、エラーが出た直後に%debugと入力するだけで、失敗地点に飛んで原因を調べられます。

事前にブレークポイントを仕込む必要がなく、学習や試行錯誤のスピードを落としません

本記事では、Python初心者でも迷わないように、起動手順と最低限のコマンドにしぼって詳しく解説します。

Jupyter/Colabの%debugとは

JupyterやColabは内部でIPythonを使っています。

%debugはそのIPythonが提供する「ポストモーテムデバッガ(例外発生直後に入るデバッガ)」を起動するマジックコマンドです。

直前に起きた最後の未処理例外のスタックフレームに入り、変数やコードの状態をその場で調べられます

エラー直後に使える簡単デバッガ

エラーが起きたら、同じノートブックの次のセルで%debugと打つだけです。

以下は最小例です。

Python
# エラーをわざと起こす最小例
def boom():
    # 0で割ると ZeroDivisionError が発生します
    return 1 / 0

boom()  # ここで例外が発生してセルが停止
実行結果
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
Python
# 直後のセルでデバッガに入る
%debug
# 以降は ipdb> プロンプトでコマンドを入力します
# 例: w (where), l (list), p <式>, q (quit) など
実行結果
> <ipython-input-...>(3)boom()
      2 def boom():
----> 3     return 1 / 0
      4 
ZeroDivisionError: division by zero
ipdb> w
  ... 省略 ...
> <ipython-input-...>(3)boom()
ipdb> l
      1 def boom():
      2     # 0で割ると ZeroDivisionError が発生します
----> 3     return 1 / 0
      4 
ipdb> p 1+1
2
ipdb> q

以下はGoogle Colabで実行した例です。

Tracebackから原因をその場で確認

Tracebackで示されたエラー行で実際に停止し、その時点の変数や関数の呼び出し関係を確認できます

行周辺のコード表示や、各フレームの変数チェックが1つの画面で完結するため、原因特定までの往復が減ります。

Python初心者でも使いやすいIPythonマジック

%debugインポート不要1行コマンドで起動できます。

通常のpdbのように複雑な設定は不要で、Jupyter/Colabのセルのまま対話的に使えるため、最初のデバッガ体験として最適です。

使い方(手順)

流れは「エラーを出す」→「すぐ%debug」→「調べる」→「qで抜ける」だけです。

再現しやすい小さな例で練習しておくと、本番で迷いません。

エラーを発生→直後に%debugを実行

関数をまたぐ例で、スタック移動も体験してみましょう。

Python
# 例: 空のリストの平均を計算しようとして 0除算エラーになるコード
def sum_list(nums):
    # 総和だけは正常に計算できる
    return sum(nums)

def calc_mean(nums):
    total = sum_list(nums)
    n = len(nums)  # n が 0 のときに次の行で 0除算
    return total / n

def main():
    data = []  # バグ: 空データを渡してしまう
    return calc_mean(data)

main()  # ここで ZeroDivisionError
実行結果
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero
Python
# 直後のセルでデバッガに入る
%debug
実行結果
> <ipython-input-...>(9)calc_mean()
      7     n = len(nums)  # n が 0 のときに次の行で 0除算
----> 8     return total / n
      9 
ipdb> w      # どこから呼ばれたか(スタック)を確認
  <ipython-input-...>(13)main()
> <ipython-input-...>(8)calc_mean()
ipdb> p nums # 現在のフレーム(calc_mean)の引数
[]
ipdb> p n    # 問題の値を特定
0
ipdb> up     # 呼び出し元(main)へ移動
> <ipython-input-...>(12)main()
ipdb> p data # 呼び出し元のローカル変数を確認
[]
ipdb> q      # 調査が済んだら終了

Colabでも同じ手順で起動

Colabでも手順は同じで、%debugを次のセルで実行します。

出力領域にipdbプロンプトが現れ、wpなどのコマンドを対話的に打てます。

ノートブック環境により表示の行番号やパス表記が多少異なりますが、操作は変わりません。

Colab利用時の小さなポイント

Colabでは、セルの再実行や出力クリアを行っても最後の例外が残っていれば%debugで入れます。

ただしカーネルを再起動すると履歴と変数は完全に消えるため、次節の注意点もご覧ください。

終了はq(quit)で抜ける

デバッグを終えたらq(またはquit)で終了します。

誤って抜けた場合は、再度%debugを実行すれば同じ場所に戻れます。

text
ipdb> q
# → デバッガ終了。セルの実行も終了します。

基本コマンド(最小セット)

最低限これだけ押さえれば、原因調査は十分に進められます。

コマンド早見表:

コマンド意味
w または where停止位置と呼び出し関係を表示
p 式変数や式の評価結果を表示
l または list現在行の前後のソースを表示
up/down呼び出し元/呼び出し先のフレームへ移動

どこで止まったか確認(where/w)

スタックの全体像を掴むと、どの層で設計ミスが起きたのかが見えます。

現在位置には矢印が付きます。

text
ipdb> w
  <ipython-input-...>(13)main()
> <ipython-input-...>(8)calc_mean()

変数の中身を見る(p 変数名)

pそのフレームのスコープで式を評価します。

辞書やリストが大きい場合はpp(pretty print)が見やすいです。

text
ipdb> p nums
[]
ipdb> p n
0
ipdb> pp {"n": n, "total": total}
{'n': 0, 'total': 0}

エラー行周辺を表示(list/l)

l前後数行のソースを一覧できます。

範囲指定l 1,50のような使い方も可能です。

text
ipdb> l
      5 def calc_mean(nums):
      6     total = sum_list(nums)
      7     n = len(nums)
----> 8     return total / n
      9 
ipdb> l 1,20

呼び出し元へ移動(up)・戻る(down)

upで1段上のフレーム(呼び出し元)へ、downで下へ移動します。

上位フレームの引数やローカル変数を確認し、入力データの誤りを特定できます。

text
ipdb> up
> <ipython-input-...>(12)main()
ipdb> p data
[]
ipdb> down
> <ipython-input-...>(8)calc_mean()
ipdb> p n
0

よくある質問と注意点

初心者がつまずきやすいポイントを押さえておくと、実戦投入がスムーズです。

エラーがないと%debugは起動しない

直近に未処理例外が発生していないと%debugは入れません

メッセージ例は以下の通りです。

Python
%debug
実行結果
No exception is being debugged

try-exceptで例外を自前で捕まえた場合は未処理にならないため%debugは動きません。

必要に応じてexcept内でraiseし直すか、%pdb onの自動起動を使います。

カーネル再起動で状態はリセットされる

カーネルを再起動すると、変数や最後の例外履歴はすべて消えます

%debugの対象もリセットされるため、再現用セルをもう一度実行してから%debugに入ってください。

自動で起動したい場合は%pdb on

%pdb onを有効化すると、例外が発生した瞬間に自動でデバッガに入ります

調査の手間をさらに減らせます。

Python
# 自動デバッグを有効化
%pdb on

def f():
    # ここでエラーが起きた瞬間に自動で ipdb に入る
    return 1 / 0

f()
実行結果
Automatic pdb calling has been turned ON
> <ipython-input-...>(6)f()
      5 def f():
----> 6     return 1 / 0
      7 
ZeroDivisionError: division by zero
ipdb> p 1+1
2
ipdb> q
Python
# 使い終わったら無効化
%pdb off

補足: %pdbの設定はセッション単位です。

ノートブックを再起動したら再度オンにしてください。

JupyterでもColabでも同様に利用できます。

まとめ

%debugは、Jupyter/Colabでエラー直後に原因へ最短距離で到達するための強力な第一歩です。

操作は、エラーを出してから%debugで入り、wで位置を把握し、pで変数を確認し、lでコードを読み、必要ならup/downで呼び出し元に遡る、最後にqで抜ける、というシンプルな流れです。

自動化したい場合は%pdb onも活用すると、再現→調査→修正のサイクルがぐっと短くなります。

初心者の方は本記事の最小コマンドだけでも十分に威力を発揮しますので、まずは小さな例で手を動かして慣れてみてください。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!