6

次の質問があります。システムの観点から、これを簡単かつ効率的に達成する方法を知りたいです。

デバッグ情報を使用してビルドされたタスク「abc」と、通常は 0 に設定されているグローバル変数「TRACE」が与えられた場合、次の時間の間に呼び出された各関数のアドレスを「ログ」ファイルに出力したいと思います。 TRACE は 1 に設定され、再び 0 に戻ります。

私は、ジャンプ/フレームポインタープッシュの一般的なパターンの命令を調べ、アドレスを書き留めてから、アドレスをシンボリックから関数名にマッピングする、開発するフロントローディング/ブートストラップタスクを通じてこれを行うことを検討していましたabc のデバッグ情報。ただし、フロントローダーなしでこれを行うためのより良いシステムレベルの方法がある可能性がありますが、何が最も実現可能かはわかりません。

そこに実装されたテクニックはありますか?

4

3 に答える 3

3

1 つの可能性は、ソースをコンパイルする前に前処理することです。この前処理により、TRACE グローバルをチェックし、設定されている場合はログに書き込むコードが各関数の先頭に追加されます。Mystagogue が言ったように、コンパイラには、関数の名前に展開されるプリプロセッサ マクロがあります。

また、いくつかのプロファイリング ツールを確認することもできます。それらのいくつかは、あなたが求めているものに近い機能を備えています。たとえば、呼び出しスタック全体を定期的にサンプリングするものもあります。これにより、すべての呼び出しを実際にログに記録しなくても、コード フローについて多くのことを知ることができます。

于 2010-08-30T17:58:30.677 に答える
2

共通のプロローグ/エピローグを探すことは、フレーム ポインターの省略とテール コールの最適化が存在する場合には機能しません。また、最新のオプティマイザーは、関数をいくつかのチャンクに分割し、異なる関数の共通のテール チャンクをマージすることを好みます。

標準的な解決策はありません。

Microsoft コンパイラについては、_penterおよび_pexitフックを確認してください。GCC については、-finstrument-functionsオプションとその仲間を見てください。

また、x86 Windows では、WinApiOverride32などのモニターを使用できます。主に DLL とシステム API 呼び出しを監視することを目的としていますが、アプリケーションのマップ ファイルから記述ファイルを生成し、内部関数を監視することもできます。

(編集: GCCオプションへのリンクを追加。 )

于 2010-08-30T17:59:39.587 に答える
1

__func__または__FUNCTION__の事前定義された識別子を調べたことを確認してください。これらは、現在実行している関数/メソッド名の文字列リテラルを提供します。

于 2010-08-30T17:37:24.577 に答える