4

ユーザー空間の C99 プログラムで呼び出される関数とその順序を知りたいです。また、どのパラメータが与えられているか。

DTrace でこれを行うことはできますか?

プログラムの例

int g(int a, int b) { puts("I'm g"); }
int f(int a, int b) { g(5+a,b);g(8+b,a);}
int main() {f(5,2);f(5,3);}

次のテキストファイルが表示されます。

main(1,{"./a.out"})
 f(5,2);
  g(10,2);
   puts("I'm g");
  g(10,5);
   puts("I'm g");
 f(5,3);
  g(10,3);
   puts("I'm g");
  g(11,5);
   puts("I'm g");

ソースを変更したくありません。プログラムは非常に巨大で、9,000 個の関数があります。

私はすべての情報源を持っています。デバッグ情報をコンパイルしたプログラムがあり、gdb はバックトレースで関数パラメーターを出力できます。

タスクは DTrace で解決できますか?

私のOSは、BSD、Linux、MacOS、Solarisのいずれかです。私は Linux の方が好きですが、リストされている OS のどれでも使用できます。

4

3 に答える 3

-3

あなたの質問は見当違いである可能性が非常に高いです。重要なプログラムの場合、パラメーターを使用して実行されたすべての関数呼び出しのシーケンスを出力すると、数 MB または数 GB の出力が得られ、意味を理解できなくなります (詳細が多すぎて人間が理解することはできません)。理解する)。

そうは言っても、あなたが望むものを で達成できるとは思いませんdtrace

GCC-finstrument-functionsフラグを使用することから始めることができます。これにより、すべての関数の入口/出口で関数アドレスを簡単に出力できます。その後、addr2line を使用してアドレスを関数名に簡単に変換できます。これにより、要求したものが得られます (パラメーターを除く)。

結果があまり詳細ではないことが判明した場合は、GDB のすべての関数に (コマンドを使用してrb .) ブレークポイントを設定し、すべてのブレークポイントにコマンドを添付continueできます。これにより、(パラメーターを使用して) ヒットするブレークポイントの安定したストリームが発生しますが、実行は少なくとも 100 倍から 1000 倍遅くなる可能性があります。

于 2011-08-24T03:44:01.360 に答える