6

Cアプリケーションをデバッグしていますが、特定の機能にかかる時間を知りたいのですが。

ソースコードを変更して、測定を行うためのコードを追加することはできますが、それは私には正しくないようです。毎回再コンパイルせずに、外部アプリケーションでそれを実行したいと思います。

GDBでブレークポイントを設定できることがわかったので、簡単な手順で同様のツールを使用して時間を追跡できる必要があると思いました。 、もう一度時間を測定するしかし、gdbでこれを行う方法が見つかりません:(

何か案は?ありがとう

4

5 に答える 5

2

GCC を使用している場合は、コンパイル オプション "-pg" と application が必要ですgprof

于 2011-09-14T16:29:47.117 に答える
2

gprof-pgCライブラリを含むすべてのライブラリのコンパイル済みバージョンを静的にリンクする場合にのみ信頼できます-私の経験では、まったく機能しません. gcc のオプションを使用してこれを実行することもできます-profile(これは、ライブラリ-pgに sub を追加しようとし-pgます) が、問題は、GNU libc が静的にリンクされることを本当に好まず、ディストリビューションが-pg必要なすべてのライブラリのコンパイル済みバージョンを提供しない可能性があることです。

を試すことをお勧めしますcachegrind。これはvalgrind操作モードであり、すべてのデバッグ情報のみが必要です。その方がはるかに簡単です。問題は、莫大な間接費がかかることです。非常に大きいため、テストが無効になる可能性があります。少なくとも 2 倍の速度低下が予想されます。

perfコピーを手に入れることができれば、試すこともできます。それは非常に賢いですが、人々はゼロから何かを構築するのが好きだと考えるカーネル ハッカーによるものです。私はそれで非常に複雑な運がありました。(ユーティリティではなく、基礎となる API に関するhttp://web.eecs.utk.edu/~vweaver1/projects/perf-events/を読んでください。それでも、無駄な時間を大幅に節約できる可能性があります。)

于 2011-09-14T17:12:19.337 に答える
0

プロファイリングはおそらくあなたが望むものです。profまたはgprofを見てください。

更新:「cc-Wall -ggdb -pg -g3 -O2 diskhash.c -o diskhash」でコンパイルした後(およびプログラムを実行した後)、「gprof-pdiskhash」は次のようになります。

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 32.60      0.41     0.41        1   410.75   646.18  create_hashtab
 31.80      0.81     0.40  5087692     0.00     0.00  hash_func
 27.83      1.16     0.35  2543846     0.00     0.00  find_hash
  2.78      1.20     0.04  2543846     0.00     0.00  chop_a_line
  1.59      1.22     0.02                             main
  0.40      1.22     0.01                             frame_dummy
  0.00      1.22     0.00        4     0.00     0.00  map_da_file
于 2011-09-14T16:30:48.010 に答える