問題タブ [gprof]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - c++プログラムを搭載したMacOS10.6のgprofには呼び出しデータがありますが、タイミングデータはありません---なぜですか?
MacOS10.6で実行されているC++シングルスレッドプログラムがあります。通話数は取得していますが、時間情報は取得していません。
出力の例を次に示します。
かなり変だね?31,377,020のコールスルーがありますが、0回記録されています。
誰が何が起こっているのか知っていますか?
gcc - gprof: 48/271618093 ビンを読み取った後に予期しない EOF が発生しましたか?
このエラーの意味を知っている人はいますgprof
か? 私は走っていgcc -pg
ます。ありがとう。
gcc - gcc:_mcountへの未定義の参照(gprofインストルメンテーション)
-pg
gprofプロファイルインストルメンテーションコードを挿入するオプションを使用してC++ソースをコンパイルすると、コンパイルが失敗してundefined reference to _mcount
エラーが発生します。
このオプションがないと、すべてが正常にコンパイル(および実行)されます。私の場合、何が問題になっていますか?(Solaris 10 SPARCプラットフォーム)
profiling - gprof めちゃくちゃ
cpp コードを 2 プロファイルしようとしています。-pg フラグを付けてコンパイルし、プロファイルを作成して出力を取得した後、いくつかの非常に奇妙な関数名を取得しました。これは私が使用しているmakeファイルです:
これは、gprof 出力のサンプルです。
これらはファイル内の実際の関数名です。
忘れているフラグはありますか?また、プロファイリングで関数のパラメーターも表示されるのはなぜですか? クラスだからですか?cppだからですか?gprof と c には慣れていますが、cpp との出会いはこれが初めてです
どんな助けでも大歓迎です:)乾杯=)
profiling - gprof はどのように機能しますか?
これは肥大化した質問のようなものですので、事前にお詫び申し上げます。gprof
低技術レベルでどのように機能するのか興味があります。タイマーによって行われることは理解していますが、プロファイルするために実行可能ファイルを特別にコンパイルする必要があるのはなぜですか? コンパイルにより、統計用にスペースが割り当てられますか?
また、タイミングは正確にどのように行われますか?
c++ - gprof出力の不正確さ
gprofを使用してc++関数のプロファイリングを試みていますが、%timeに興味があります。私は複数回実行しましたが、何らかの理由で結果に大きな違いがありました。何が原因なのかわかりません。サンプリングレートを想定しているか、他の投稿でI/Oがそれと関係があると読んでいます。それで、それをより正確にして、どういうわけかほぼ一定の結果を生成する方法はありますか?
私は次のことを考えていました:
- サンプリングレートを上げる
- 何かを実行する前にキャッシュをフラッシュします
- 別のプロファイラーを使用しますが、関数時間%関数名としてgrofと同様の形式で結果を生成したいので、Valgrindを試しましたが、ファイルのサイズが大きくなりました。したがって、間違ったコマンドでファイルを生成している可能性があります。
入力を待っています
よろしく
c - FreeBSD で実行されている継続的に実行されているサーバーをプロファイリングする方法
重複の可能性:
プロセスを強制終了する前に gmon.out を保存する
Linux 環境でサーバー (私が入手できるソース コード、c コード) のプロファイルを作成しようとしています。このサーバーは、Web サーバーのように継続的に実行されます。gprof を使用してサーバーのプロファイルを作成しようとしています。サーバーが単独で終了すると、gmon.out ファイルが生成されます。プロファイリングされたデータを理解するには、gprof と gmon.out を使用できます。今私が抱えている問題は、このサーバーが継続的に実行され、着信ソケット接続、要求などを待っていることです。このサーバーを強制終了すると、gmon.out が生成されません。この時点で、次のオプションが表示されます。
- ソースコードを変更してそれ自体をプロファイリングし、SIGKILL シグナルを受信した後にこの情報をログに記録します。これは最も醜い解決策であり、測定にノイズが入る可能性があります。
- サーバーがまだ稼働している間に、gprof を使用してこのサーバーのプロファイルを作成する方法があるかもしれません。
- 他のツールを試すには?
編集:サーバーはマルチプロセス サーバーです。FreeBSD 7.2 で動作
確かに、人々は以前にこの種の問題を解決したことがあります。SO または外部で有用な情報を見つけることができませんでした。
人々の考えや解決策に感謝します。
本当にありがとう。
更新 1:
- gprof はマルチプロセス サーバーでは動作しないようです。サーバーの実行後に gmon.out を取得できた場合、実際には実際の作業を行わない親プロセスのみがインストルメント化されます!
- oProfile は、私のサーバーが実行されている FreeBSD をサポートしていません。さまざまな理由で、OS を変更できません (許可されていません)。
- Valgrind の Web サイトには、FreeBSD 用のポートがありません。しかし、FreeBSD への移植への言及がいくつかあります。FreeBSD ポート ソースが見つかりませんでした。
何とか valgrind のポートを取得できました。make を実行すると、次のエラーが表示されます。
Web で valgrind-stable-352.tar.gz を見つけようとしました。私が見つけたリンクはすべて死んでいます。
freebsd に pstack をインストールしましたが、認識された pstack はスタック トレースのみを提供します。参考:http ://sourceforge.net/projects/bsd-pstack/
私の理解では、systemtap はカーネル空間のイベント、計測など専用です。
間違っているか、情報が不十分である可能性があります。私を訂正して、あなたの考えを教えてください。本当にありがとうございました。
更新 2 : プロファイリングしようとしているサーバーに関する詳細を提供すると役立つと思います。
- マルチサーバープログラムです。特定の mysql データベースであるために、I/O バウンド。
- スレッドは関係ありません。各子サーバー プロセスは、1 つの要求のみを処理します。サーバーの起動時に、設定可能な数のプロセスが作成されます。
- 各機能に費やされた時間とその頻度を見つけたいと思います。関数コードは、CPU バウンドと IO バウンドが混在しています (IO の方が多いと思います)。
- FreeBSD 7.2で実行されています
- cで書かれています。読み取りの数は、このサーバーを介したデータベースへの書き込みよりもはるかに多くなります。
linux - libc_p.so のソース コードはどこで入手できますか?
ターゲット ハードウェアで所有しているプロセスをプロファイリングしたいのですが、MIPS ターゲット ハードウェアで使用できる libc_p.so がないため、ソース コードを libc.so としてしかチェックできません。私は期待しています: 私は、利用可能な MIPS libc_p.so ライブラリがあります。または II,MIPS ライブラリを自分でコンパイルできる libc_p ソース コードが利用可能です。
有識者の方からの良い提案をお待ちしております。
c - 関数を実行順に並べる
ファイルにいくつかの関数を定義しています (メイン関数は他の人によって定義されています)。
gprof を使用して関数が呼び出された回数を分析できますが、メイン プログラムで呼び出された順序で関数のリストを取得する方法はありますか?
もちろん、各関数の最初にメッセージを書くこともできますが、かなりの数があります。
また、「このファイルで呼び出される最初の関数でブレークする」などを指定して gdb で実行できるようになれば幸いです。繰り返しますが、明示的にリストするには多すぎます。
ありがとう。
c++ - C++でのコード実行のロギング
gprofとcallgrindを何度も使用してきましたが、大規模な(車全体をロードするCADプログラムのように)プログラムを処理する場合、これらを効率的に使用できないという(明らかな)結論に達しました。たぶん、C / C ++ MACROの魔法を使って、どういうわけか単純な(しかし素晴らしい)ロギングメカニズムを構築できるのではないかと思っていました。たとえば、次のマクロを使用して関数を呼び出すことができます。
関数呼び出しの前後にクロッキング/タイミングを追加して、CALL_FUNで呼び出されるすべての関数のタイミングを調整することができます。
変数t0、t1は、グローバルロギングオブジェクトで見つけることができます。そのロギングオブジェクトは、 CALL_FUNを介して呼び出された各関数の呼び出しグラフを保持することもできます。その後、そのオブジェクトを(特別にフォーマットされた)ファイルに書き込んで、他のプログラムから解析することができます。
それで、ここに私の(最初の)質問があります:このアプローチは扱いやすいと思いますか?はいの場合、それをどのように強化できますか?そうでない場合は、時間を測定してコールグラフを記録するためのより良い方法を提案できますか?
同僚は、この問題に対処するための別のアプローチを提案しました。これは、各関数(ログに記録する必要がある)に特定のコメントを付けることです。次に、makeプロセス中に、特別なプリプロセッサを実行し、各ソースファイルを解析し、ログに記録する関数ごとにログロジックを追加し、新しく追加された(解析)コードを使用して新しいソースファイルを作成し、代わりにそのコードをビルドする必要があります。CALL_FUN ...マクロ(私の提案)をあちこちで読むのは最善のアプローチではないと思います。彼のアプローチはこの問題を解決するでしょう。では、このアプローチについてどう思いますか?
PS:私はC / C ++マクロの落とし穴に精通していないので、これが別のアプローチを使用して開発できる場合は、そう言ってください。
ありがとうございました。