0

このように一連の関数があることを確認してください

funtion_a();
funtion_b();
funtion_c();
|
|
funtion_y();
funtion_z();

これで、すべての関数が内部的に呼び出されますmagic()

何かfunction_j() calles magic()問題が発生し、その場合にデバッグしたい場合、単一の印刷ステートメントをマジックで配置すると、それぞれの場合に

function_a() calles magic()
function_b() calles magic()
|
function_z() calles magic()

そのprintfが実行され、私の興味のあるケースで何が起こるかを見るのは難しい

function_j() calles magic()

だから今、はい魔法が function_j() から呼び出されていることを追跡できるので、その場合にのみ私のデバッグ出力が来る.?

4

4 に答える 4

4

はいあります。これはデバッガーと呼ばれます。gdbか何か。コードにブレークポイントを設定すると、呼び出しスタックを表示して、呼び出された関数を確認できます。コマンドについては、特定のデバッガーを調べる必要があります。IDEに統合されているもの、コマンドラインツールであるもの、スタンドアロンであるものがあります。あなたの環境とあなたの好みに合ったものを見つけるのをグーグルに手伝ってもらいましょう。

于 2012-11-27T07:06:59.233 に答える
3

次の構造を使用できます

int debug = 0;

function magic() {
    .
    .
    if (debug) printf("hello\n");
    .
    .
}

function a();
function b();
.
.
function j() {
   debug = 1;
   .
   .
   magic();
   .
   .
   debug = 0;
}
function k();
.
.
.
function z();
于 2012-11-27T07:33:58.003 に答える
1

プロトタイプを投稿していないmagic()ので、作成します。

int magic(int a, int b);

ここで、このプロトタイプを指定して、このプロトタイプが定義されているヘッダーのその定義の下に次の行を追加します。

inline int real_magic(int a, int b) { return magic(a, b); }

#define magic(a, b) (printf(__func__ " calling magic()\n"), real_magic((a), (b)))

が実装されている変換ユニットでは、次のマクロmagic()を実行する必要があります。#undef

#undef magic

int magic(int a, int b)
{
    // implementation
}

#define magic(a, b) (printf(__func__ " calling magic()\n"), real_magic((a), (b)))

real_magic引数と戻り値のタイプに一致するように、マクロとラッパーを調整する必要があります。

これはひどいハックですが、あなたの要件を満たすために私が思いつくことができる最も簡単なメカニズムです。代わりに適切なデバッガーを使用することを検討してください。これらのデバッガーを使用すると、変数値やスタックトレース全体など、エラー発生時のプログラムの状態をより詳細に調べることができます。

于 2012-11-27T07:08:30.193 に答える
1

他の人が述べているように、デバッガーを使用することをお勧めします。ただし、急いでいて、これらprintfの診断をすべてすでに作成している場合は、出力をパイプ処理してgrep、関心のある行を確認することはできませんか?

于 2012-11-27T07:11:19.883 に答える