0

実行可能かどうかはわかりません...大きなソフトウェアコードを読んでいて、特定の変数がどのようにアクセスされているかを追跡するときに途方に暮れることがあります。

それを追跡するためのツール/方法があれば素晴らしいでしょう。

より具体的には、次のクラスがあるとします。

class A
{
  public:
    int _a;
};

...

そしていつでも

... = ...->_a;

実行時に FILE と LINE を出力したいと思います。提案していただきありがとうございます。

PS、すべての "->_a" 外観を grep できますが、それを整理するのもかなり困難です。

4

3 に答える 3

3

それ以外の:

class A
{
  public:
    int _a;
};

次のようなことができます。

#include <iostream>

class Integer
{
public:
    Integer(int value) : value(value)
    {
    }

    operator int()
    {
        std::cout << "Integer called\n";
        return value;
    }
private:
    int value;
};

class A
{
public:
    A() : _a(5) {}
    Integer _a;
};

int main(int argc, char *argv[])
{
    A a;
    std::cout << a._a << std::endl;

    return 0;
}

あなたの例に従ってください:

  • クラスを作成し、暗黙的な変換の演算子を提供します。

  • この新しいクラスをメンバー変数に置き換えます。

暗黙の変換演算子が作業を行います。

それは印刷されます:

呼び出された整数

5

ヒント: メンバー変数を public にしないでください。常にアクセサ メソッドを提供します。

編集

申し訳ありませんが、 FILELINEを忘れていました:

LINEまたはFILEを挿入する方法が見つかりませんでした。前処理中のマクロ置換中に実行時に暗黙のキャストが行われるためです。

できることは、@veer が指すように、暗黙的な変換関数にブレークポイントを置き、各呼び出しを手動でトレースすることです。

編集 2

少なくとも、実行時にコール スタックを確認することは可能です。

Linux では execinfo を介して、Windows では StackWalker を介してこれを行うことできます

于 2012-09-03T22:47:21.283 に答える
0

OpenGrokSource Navigatorなどのツールを使用して、すべての出現箇所を見つけることができます。これはランタイムではなく静的分析ですが、grep よりも簡単です。

于 2012-09-03T23:05:13.963 に答える
0

C コードをデバッグするための最も強力なツールの 1 つは GDB です。特定のニーズに応じて、GDB で watch/awatch/rwatch コマンドを使用して、変数がアクセス (読み取り/書き込み) された時点を特定できます。これらのポイントでプログラムの実行が停止したら、 を使用printしてその変数の値を確認または設定できます。

詳細については、このリンクを参照してください。

于 2012-09-04T02:59:45.073 に答える