【すたっくとれーす】

スタックトレース とは?

最終更新:
💡 その時点の呼び出しをたどる

ある時点で積み重なっている関数・メソッドの呼び出しを示す情報。例外の調査などに使い、呼び出し元をたどれる。終了済みの処理を含む実行履歴すべてではなく、表示順や含まれる情報は言語・実行環境によって異なる。

📌 このページのポイント
言語によって、表示の並びが違う 呼び出し:main → crunch → mash Javaの典型例 例外名・メッセージ mash(発生付近) crunch main Pythonの通常例 main crunch mash(発生付近) 例外名・メッセージ 関数名・ファイル名・行番号をたどる 発生付近の行が、根本原因とは限らない
表示順を比較する模式図です。実際の出力にはファイル名や行番号なども含まれ、環境によって省略や例外の連鎖もあります。
ひよこ ひよこ
スタックトレースって何行もあって読めない…
ペンギン先生 ペンギン先生
まず例外の種類とメッセージを読み、呼び出しの並び方を確認しよう。Pythonの通常のtracebackは最近の呼び出しが下、Javaの典型的な表示は上だよ。「一番下が必ずエラーの場所」とは決めず、ファイル名や行番号をたどるんだ。
ひよこ ひよこ
実行した関数が全部記録されているの?
ペンギン先生 ペンギン先生
その時点で続いている呼び出しの積み重なりが中心で、すでに戻った関数も含めた全実行履歴ではないよ。環境によってフレームや行番号が省略されることもある。例外を捕まえて処理を続ける場合にも調査に使えるんだ。
ひよこ ひよこ
自分のコードじゃなくてライブラリの中のエラーってどう読むの?
ペンギン先生 ペンギン先生
自分のコードからライブラリを呼んだ行を探し、渡した値や使い方を確認すると手掛かりになるよ。ただしライブラリ側の不具合もあり得る。例外が表面化した行だけで原因を決めず、呼び出し元や関連するログも調べよう。
ひよこ ひよこ
エラーの種類やメッセージはどこを見るの?
ペンギン先生 ペンギン先生
Pythonでは通常、呼び出しの一覧の後に種類とメッセージが出る。Javaでは先頭の例外名や説明に続いて呼び出しが並ぶよ。さらに「Caused by」などで別の例外がつながることもあるから、最初の一行だけで判断しないことが大切なんだ。
ひよこ ひよこ
本番環境のスタックトレースをユーザーに見せちゃいけないの?
ペンギン先生 ペンギン先生
公開エラー画面にそのまま出すと、内部のファイルパスや構成が漏れることがあるよ。利用者には必要な案内を表示し、詳細はアクセスを制限したログなどで調べられる設計にしよう。ログに秘密情報を含めない配慮も必要なんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「スタックトレース」って出てきたら「ある時点の関数呼び出しの積み重なりを示す情報」と思えばだいたいOK!
📖 おまけ:英語の意味
「stack trace」 = スタック(積み重ね)の追跡
💬 関数の呼び出しが積み重なるコールスタックを、trace(追跡)することから来ているよ。例外時だけでなく、調査のために実行中のスタックを出力することもできるんだ

参考資料

← 用語集にもどる