スタックトレース
コンピュータにおいて、スタックトレース(英語: stack trace)とは、プログラムの実行中の特定の時点でのアクティブなスタックフレームのレポートである。スタックバックトレース(英語: stack backtrace[1])、スタックトレースバック(英語: stack traceback[2])とも言い、単にバックトレースとも言う[注釈 1]。 詳細プログラムが実行されると、多くの場合、スタックとヒープの2つの場所にメモリが動的に割り当てられる。スタックという用語はプログラム要素としての一般的なデータ構造のひとつについても使われるため、区別するために、このスタックはコールスタック (call stack) と呼ばれる。ヒープはプロセス内の全スレッドで共有されるが、コールスタックはスレッドごとに割り当てられる。技術的には、メモリブロックがいったんスタックに割り当てられると、その前に割り当てられていた他のメモリブロックが存在している可能性があるため、簡単に削除することはできない[注釈 2]。プログラムで関数(サブルーチン)が呼び出されるたびに、コールスタックの最上部にスタックフレーム(またはアクティベーションレコード)と呼ばれるメモリブロックが割り当てられる。スタックフレームは一般的に、関数宣言の仮引数に対応する値として関数に渡された実引数、関数内で定義されたローカル変数、関数終了時に復帰する位置を記憶するためのリターンアドレスなどを保持する[3]。 プログラマは通常、デバッグにおいてスタックトレースを使用する。一般的な統合開発環境では、デバッガをブレーク(一時停止)したときに「呼び出し履歴」としてスタックトレースを直感的に表示・追跡することができる[4]。エンドユーザには、エラーメッセージの一部としてスタックトレースが表示されることがあり、障害報告の際に活用することができる。 スタックトレースを使用すると、スタックトレースが生成されるまでの、呼び出された入れ子関数のシーケンスを追跡できる。事後分析では、障害が発生した関数まで追跡できる(ただし必ずしも追跡できるわけではない)。末尾再帰はスタックトレースに表示されない。 次の、エラーが含まれたPythonプログラムで説明する。 def a():
i = 0
j = b(i)
return j
def b(z):
k = 5
if z == 0:
c()
return k/z
def c():
error() #存在しない関数を呼び出そうとしている
a()
このプログラムを標準のPythonインタプリタで実行すると、次のエラーメッセージが生成される。 Traceback (most recent call last):
File "tb.py", line 15, in <module>
a()
File "tb.py", line 3, in a
j = b(i)
File "tb.py", line 9, in b
c()
File "tb.py", line 13, in c
error()
NameError: name 'error' is not defined
スタックトレースは、エラーが発生した場所、つまり関数 これらの3つの関数のそれぞれのアクティベーションレコードは、関数 プログラミング言語によるサポートJavaやC# (.NET) など多くのプログラミング言語には、システムコールを介して現在のスタックトレースを取得するための機能が標準クラスライブラリおよび実行環境に組み込まれている[5][6][7]。 C++にはスタックトレースを取得するための標準化された組み込みの機能はないが、Boost C++ライブラリのBoost.Stacktrace[8]、stacktraceライブラリ(2013年を最後に更新停止)などを使用してスタックトレースを取得できる。C++23ではBoost.Stacktraceをベースに標準化したサブセットとして JavaScriptでは、例外オブジェクトが、スローされた場所からのスタックを含む 脚注注釈
出典
関連項目 |
Portal di Ensiklopedia Dunia