関数の呼び出し履歴 | Programming Place Plus Visual Studio編

トップページVisual Studio編

この章の概要 🔗

この章の概要です。


関数の呼び出し履歴とは 🔗

デバッグに有用な機能の1つに、呼び出し履歴があります。

この機能は、ブレークポイントと組み合わせて使用します。ブレークポイントによって実行を一時停止させ、その時点までにどのような経路をたどって、現在の関数に到達したのかを確認できます。

最初に想像するものとは意味が違うかもしれません。次のサンプルプログラムを見てください。

#include <stdio.h>

void f1(void);
void f2(void);
void f3(void);

void f1(void)
{
    int x = 0;

    f2();
    x = 10;
    f3();
}

void f2(void)
{
    puts("Hello,");
}

void f3(void)
{
    puts("World");  // ここにブレークポイントを設定して一時停止
}

int main(void)
{
    f1();

    return 0;
}

f3関数の中でブレークポイントを設定して、一時停止させたとします。ここに到達するまでの関数呼び出しの経路は、

  1. main関数
  2. f1関数
  3. f2関数
  4. f3関数

の順番だと思うでしょう。関数の呼び出し履歴の機能で確認できる情報はこれではなく、次のようになります。

  1. main関数
  2. f1関数
  3. f3関数

関数から戻ってくると、その関数の履歴は消失します。f2関数は確かに呼び出されたものの、そこからはすでに返ってきていますから、この部分の履歴は残らないということです。

このような履歴情報をコールスタックなどと呼びます。

コールスタックは一定の大きさで確保されているため、呼び出しの階層があまりにも深くなるなどして、不足してしまう可能性があります。コールスタックの大きさは設定で変更できます(「コールスタックの大きさ」のページを参照)。

関数の呼び出し履歴を見る 🔗

関数の呼び出し履歴を見るには、ブレークポイントを使って実行を一時停止させた後、【呼び出し履歴】ウィンドウを確認するだけです。

【呼び出し履歴】ウィンドウが表示されていない場合は、メニューバーから【デバッグ】>【ウィンドウ】>【呼び出し履歴】を選択するか、ショートカットキーの Alt + 7 を押してください。

呼び出し履歴ウィンドウ

左端の黄色い矢印が、現在の実行位置を示しています。ですから、下の行に行くほど、早い段階で呼び出された関数です。赤い丸はブレークポイントです。

あまり気にすることはありませんが、関数名の手前には、実行ファイルの名前(と「!」)が付いています。表示のされ方は、右クリックで表示されるメニュー内の項目から変更できます。たとえば、【モジュール名の表示】のチェックを外すと、実行ファイルの名前は表示されなくなります。

また、自分で書いたプログラムでない部分は、「外部コード」と表示されています。

行の上で右クリックして、【ソースコードへ移動】を選択すると、その関数の位置へエディタのカーソルを移動できます。

デバッグのコンテキストを切り替える 🔗

【呼び出し履歴】ウィンドウで、行の上でダブルクリックすると、デバッグのコンテキスト(文脈)を切り替えられます。つまり、その関数が実行されようとしていた時点での状況に、各種デバッグ表示を切り替えられます。

たとえば、f3関数内で一時停止させた時点での【ローカル】ウィンドウは、次のようになっています。

デバッグのコンテキストを切り替える

f3関数にはローカル変数がないので、空になっています。では、【呼び出し履歴】ウィンドウ内の f1関数の行をダブルクリックしてみます。

デバッグのコンテキストを切り替える

f1関数には、ローカル変数 x があるので、その値や型が表示されました。なお、このとき、【呼び出し履歴】ウィンドウの方は、左端に緑色の矢印が表示されます。

デバッグのコンテキストを切り替える

このように、デバッグのコンテキストを切り替えることによって、ある時点ではどんな状況であったかを調べることができます。


参考リンク 🔗



更新履歴 🔗

 新規作成。



Visual Studio編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る