コールスタックは、スタックフレームと呼ばれる隣接した断片、又は short のフレームという; コールされた一つの関数に関連するデータを 持つフレームに分けられます。フレームには関数に与えられた引数、関数の ローカル変数、そして関数が実行される先のアドレスに関する情報が含まれ ます。
あなたのプログラムがスタートした時、スタックは関数 main
に関する
単一フレームです。これは初期フレーム、又は一番外のフレームと
呼ばれます。関数がコールされる度に、新しいフレームが生成されます。
関数がリターンする度に、その関数が作り出したフレームは削除されます。
関数がリカーシブな場合、同一関数に対するフレームが多数生成されます。
関数のフレームにおいて処理の実行が実際に行われるのは最深部の
フレームと呼ばれるものです。これは、存在する全てのスタックフレームの
中で一番最近に生成されたものです。
あなたのプログラムの中では、スタックフレームはアドレスによって識別 されます。スタックフレームは自分自身のアドレスも持った多くのバイト列を 含んでおり; 様々な種類のコンピュータにおいて、フレームのアドレスを持ったアドレスの バイト列の一つを選ぶという選択上の決まりがあります。通常、このアドレスは、 フレーム内で処理が実行している時、フレームポインタ・レジスタと 呼ばれるレジスタに保持されています。
GDB は、存在する全てのスタックフレームに、コールされた最深部の フレームをゼロとしてスタートした番号を、上に向かって順次割り当てて います。これらの番号はあなたのプログラムの中に実際に存在するわけでは ありません; これは、GDB のコマンドに対してスタックフレームを指示する方法として 与えられたものです。
多くの GDB のコマンドは、一つのスタックフレームを無条件に参照します。 GDB は、選択されたフレームと呼ばれるスタックフレームを記録 しており; あなたは任意のフレームを1セットの GDB コマンドを使って選択することが でき、そこで、他のコマンドは新しいフレームを処理するようになります。 あなたのプログラムが停止した場合、GDB は最深部のフレームを自動的に 選択します。
ある関数はスタック上にフレームを確保しないで動作するようにコンパイル されているかもしれません。このようなケースは、非常に多用される ライブラリ関数のスタック生成時間を省略するような場合、時々おこります。 GDB は、このような関数起動の振るまいに対する便宜を制限します; もし、最深部の関数がスタックフレームなしで起動されたら、GDB は0への 仮想スタックフレームを与え、関数コールのチェインが正しくトレース できるようにします。スタック上の結果は、関数の起動とは別で、最深部の 関数がフレームを持たないため未定義となります。