この章の概要です。
この機能は、ブレークポイントと組み合わせて使用します。ブレークポイントによって実行を一時停止させ、その時点までにどのような経路をたどって、現在の関数に到達したのかを確認できます。
最初に想像するものとは意味が違うかもしれません。次のサンプルプログラムを見てください。
#include <stdio.h>
void f1(void);
void f2(void);
void f3(void);
void f1(void)
{
int x = 0;
();
f2= 10;
x ();
f3}
void f2(void)
{
("Hello,");
puts}
void f3(void)
{
("World"); // ここにブレークポイントを設定して一時停止
puts}
int main(void)
{
();
f1
return 0;
}
f3関数の中でブレークポイントを設定して、一時停止させたとします。ここに到達するまでの関数呼び出しの経路は、
の順番だと思うでしょう。関数の呼び出し履歴の機能で確認できる情報はこれではなく、次のようになります。
関数から戻ってくると、その関数の履歴は消失します。f2関数は確かに呼び出されたものの、そこからはすでに返ってきていますから、この部分の履歴は残らないということです。
コールスタックは一定の大きさで確保されているため、呼び出しの階層があまりにも深くなるなどして、不足してしまう可能性があります。コールスタックの大きさは設定で変更できます(「コールスタックの大きさ」のページを参照)。
関数の呼び出し履歴を見るには、ブレークポイントを使って実行を一時停止させた後、【呼び出し履歴】ウィンドウを確認するだけです。
【呼び出し履歴】ウィンドウが表示されていない場合は、メニューバーから【デバッグ】>【ウィンドウ】>【呼び出し履歴】を選択するか、ショートカットキーの Alt + 7 を押してください。
左端の黄色い矢印が、現在の実行位置を示しています。ですから、下の行に行くほど、早い段階で呼び出された関数です。赤い丸はブレークポイントです。
あまり気にすることはありませんが、関数名の手前には、実行ファイルの名前(と「!」)が付いています。表示のされ方は、右クリックで表示されるメニュー内の項目から変更できます。たとえば、【モジュール名の表示】のチェックを外すと、実行ファイルの名前は表示されなくなります。
また、自分で書いたプログラムでない部分は、「外部コード」と表示されています。
行の上で右クリックして、【ソースコードへ移動】を選択すると、その関数の位置へエディタのカーソルを移動できます。
【呼び出し履歴】ウィンドウで、行の上でダブルクリックすると、デバッグのコンテキスト(文脈)を切り替えられます。つまり、その関数が実行されようとしていた時点での状況に、各種デバッグ表示を切り替えられます。
たとえば、f3関数内で一時停止させた時点での【ローカル】ウィンドウは、次のようになっています。
f3関数にはローカル変数がないので、空になっています。では、【呼び出し履歴】ウィンドウ内の f1関数の行をダブルクリックしてみます。
f1関数には、ローカル変数 x があるので、その値や型が表示されました。なお、このとき、【呼び出し履歴】ウィンドウの方は、左端に緑色の矢印が表示されます。
このように、デバッグのコンテキストを切り替えることによって、ある時点ではどんな状況であったかを調べることができます。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |