スタックトレースとは? わかりやすく解説

Weblio 辞書 > コンピュータ > IT用語辞典 > スタックトレースの意味・解説 

スタックトレース

【英】stack trace

スタックトレースとは、プログラムの実行過程記録したスタックフレーム記録しておくことである。

スタックフレームは、関数呼ばれるために生成されるその内容システムコンパイラなどの実装によって異なるが、呼び出し元へ戻りアドレスローカル変数などによって構成されている。

スタックトレースでは、プログラムのデバック時に実行過程プレイバックするための情報として活用でできる。関数名情報さえあれば、スタックトレースから問題発生時に最後に実行していた関数名がわかる。また、プログラムが異常動作結果により停止した場合には、スタックトレースにより、想定外関数動作していたことや、思わぬルート実行されていたことなどが分かる場合があり、問題解決重要な手がかりになる。

プログラミングのほかの用語一覧
開発環境:  シンボリックデバッガ  条件コンパイル  シングルステップ実行  スタックトレース  デバッガ  デバッグ  トレース

スタックトレース

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/04/29 10:33 UTC 版)

コンピュータにおいて、スタックトレース英語: 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

スタックトレースは、エラーが発生した場所、つまり関数cを示している。また、関数cは関数bから、関数bは関数aから、関数aはプログラムの15行目(最終行)から呼び出されたことも示している。

これらの3つの関数のそれぞれのアクティベーションレコードは、関数aがスタックの下部を占有し、関数cがスタックの上部を占有するようにスタックに配置される。

プログラミング言語によるサポート

JavaC# (.NET) など多くのプログラミング言語には、システムコールを介して現在のスタックトレースを取得するための機能が標準クラスライブラリおよび実行環境に組み込まれている[5][6][7]

C++にはスタックトレースを取得するための標準化された組み込みの機能はないが、Boost C++ライブラリのBoost.Stacktrace[8]stacktraceライブラリ(2013年を最後に更新停止)などを使用してスタックトレースを取得できる。C++23ではBoost.Stacktraceをベースに標準化したサブセットとしてstd::stacktraceが導入される予定である[9]

JavaScriptでは、例外オブジェクトが、スローされた場所からのスタックを含むstackプロパティを保持している。他にはconsole.trace()メソッドを利用する方法もある[10]

脚注

注釈

  1. ^ GNUデバッガ (gdb) でのレポートコマンドは、バックトレース (backtrace) を縮めたbtである。GNUデバッガ#コマンド例も参照。
  2. ^ コールスタックの割り当てと解放は通例オペレーティングシステムが担当し、アプリケーションプログラムで明示的に割り当てと解放をする必要はない。

出典

関連項目



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「スタックトレース」の関連用語

スタックトレースのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



スタックトレースのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
IT用語辞典バイナリIT用語辞典バイナリ
Copyright © 2005-2025 Weblio 辞書 IT用語辞典バイナリさくいん。 この記事は、IT用語辞典バイナリの【スタックトレース】の記事を利用しております。
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのスタックトレース (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2025 GRAS Group, Inc.RSS