7

私は埋め込みコードに取り組んでおり、今のところ、実行のフローを理解するために関数内からの印刷に完全に依存しています(利用可能なスタックトレース機能はありません)。

たくさんのprintステートメントを配置し、コードをビルドして実行すると、他の12か所にもprintを配置する必要があることに気付くことがよくあります。そして、1時間のプロセスを再開します。

分析したい5つまたは6つのcファイルを取得して、各関数に印刷ステートメントを追加するツールを実行する簡単な方法はありますか?(これはCで行われているため、明らかに変数宣言の後にある必要があります)

さらに良いのは、if/elseまたはswitch/caseが存在するたびに印刷することです。基本的には任意の条件ステートメントです。

4

5 に答える 5

11

使用しているコンパイラについては言及していませんが、gcc には非常に便利なスイッチがあります。

-finstrument-functions

これにより、各関数の入口と出口で特別な呼び出しが挿入されます。この調整により、関連するファイルのみをコンパイルでき、ソース コードを変更する必要はありません。

呼び出しは、作成する必要がある 2 つの関数に対して行われます。

      void __cyg_profile_func_enter (void *this_fn,
                                     void *call_site);
      void __cyg_profile_func_exit  (void *this_fn,
                                     void *call_site);

Etrace は、これを悪用して呼び出しトレースを作成するために設計されたツールです。http://ndevilla.free.fr/etrace/ を参照してください

于 2011-03-13T20:35:15.867 に答える
1

このようなマクロを使用できます

 #define begin {printf(__func__##" Started");
 #define end printf(__func__##" Ended");}

次に、すべての{,}を begin および end マクロに置き換えます (__func__ は関数名を返すマクロであり、C99 で定義されています。他のコンパイラ用の同等のマクロもあります)。

于 2011-03-13T20:32:40.730 に答える
0

5〜6個のファイルのみを手動で入力して、各関数にPRINT(「関数名」)マクロを追加し、文字列を出力するか、何も出力しないように定義します

ctags を使用してファイルを分析し、これを自動的にビルドすることもできますが、何百ものファイルがない限り、手動で行う方が速いでしょう

于 2011-03-13T20:34:42.647 に答える
0

vim がお気に入りのエディターである場合は、プラグイン ( http://www.vim.org/scripts/script.php?script_id=213 ) をインストールして、関連するテンプレートをカスタマイズできます。多くのさまざまなタスクに役立ちます。(これは、定義する新しい関数で機能します。これはあなたのケースではありませんが、将来の使用に役立つ可能性があります)

于 2011-03-13T20:36:05.460 に答える
0

GBD などのデバッガーを使用することをお勧めします。そうすれば、プログラムを「段階的に」実行して、そのような状態を分析することもできます。すべての関数で何かを印刷する理由がわかりません。

于 2011-03-13T20:36:31.697 に答える