問題タブ [callgrind]
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.
linux - Linux 上の Valgrind: アクティベーションの開始を遅らせる
使用する
valgrind --tool=callgrind
Linux の場合
.....定型メッセージをプロセスに渡したいと思います。ただし、メッセージの最初の 90% などについては、マップを作成するために、通常どおり処理したいと考えています。次に、最後の 10% のメッセージに対してのみ valgrind/callgrind を有効にしたいと思います。
これは可能ですか?
私の C++ コードでカウンターをインクリメントし、カウンターが特定のしきい値に達したときに valgrind/callgrind をアクティブにする方法があるかもしれません。
フィードバックをお待ちしております。
c - cachegrind と callgrind を使用した異なる読み取り数と書き込み数
私は Cachegrind、Callgrind、Gem5 でいくつかの実験を行っています。アクセス数が、cachegrind の読み取り、callgrind の書き込み、および gem5 による読み取りと書き込みの両方としてカウントされていることに気付きました。
非常に簡単な例を見てみましょう:
私はコンパイルします:
gcc ex.c --static -o ex
基本的に、asmファイルによると、addl $1, -8(%rbp)
100,000回実行されます。読み取りと書き込みの両方であるため、100k の読み取りと 100k の書き込みを期待していました。ただし、cachegrind はそれらを読み取りとしてのみカウントし、callgrind は書き込みのみとしてカウントします。
-
誰かが私に合理的な説明をしてもらえますか? 実際には ~100k の読み取りと ~100k の書き込み (つまり、addl の 2 つのキャッシュ アクセス) があると考えるのは正しいでしょうか?
c++ - Boost.Spirit を使用してトークン化された自由形式の文法を解析する
valgrind の一部である callgrind ツールの出力用の Boost.Spirit パーサーを作成しようとして行き詰まりました。Callgrind はドメイン固有の組み込みプログラミング言語 (DSEL) を出力します。これを使用すると、合成カウンターのカスタム式など、あらゆる種類の優れた機能を実行できますが、解析するのは簡単ではありません。
サンプルの callgrind 出力をhttps://gist.github.com/ned14/5452719#file-sample-callgrind-outputに配置しました。https://gist.github.com/ned14/5452719#file-callgrindparser-hppおよびhttps://gist.github.com/ned14/5452719で、Boost.Spirit lexer およびパーサーに現在の最善の試みを行いました。 #file-callgrindparser-cxx . レクサー部分は簡単です。タグ値、空白以外のテキスト、コメント、行末、整数、16 進数、浮動小数点数、および演算子をトークン化します (サンプル コードの句読点は無視してください。これらは使用されていません)。空白はスキップされます。
ここまでは順調ですね。問題は、トークン化された入力ストリームの解析です。私はまだ主要なスタンザを試みていませんが、ファイル内の任意の場所で発生する可能性のあるタグ値を解析しようとしています。タグの値は次のようになります。
自由形式のテキストでもかまいません。
この状況では、一連のトークンを文字列、つまり iterator_range に変換して抽出する必要があります。
ただし、式の場合もあります。
これは、これから、イベント EPpsec は、I1mr に 1120 を掛けたものに Ir を掛けた 316 を足したものとして合成されることを意味します。
ここで言いたいのは、タグと値のペアを任意のトークンのセットとして蓄積し、後処理して後で変換する必要があるということです。
そのために、Boost.Spirit の utree() クラスはまさに私が求めていたものであり、それがサンプル コードで使用されています。しかし、VS2012 で 11 月の CTP コンパイラを可変個引数テンプレートとともに使用すると、現在、次のコンパイル エラーが発生しています。
...これは、前方反復子の性質のためのistreambuf_iteratorのBoost.Spirit multi_pass<>ラップである私のbase_iterator_typeが、Boost.Spiritのutree()実装によって何らかの形で理解されていないことを示唆しています。つまり、これが私の悪いコードなのか、それとも悪い Boost.Spirit コードなのかはわかりません。
過去の Stackoverflow ヘルプのおかげで、トークン化されていない純粋な文法を書くことができましたが、それはもろいでしょう。適切な解決策は、トークン化して、かなり任意の入力が可能な自由形式の文法を使用することです。Boost.Spirit の Lex と Grammar を実際の例で連携させてこれを達成した例は、おもちゃの例ではなく、残念ながら非常に少ないです。したがって、どんな助けでも大歓迎です。
ニール
c++ - Callgrind が動的にロードされた SO のソースを認識しない
callgrind のいくつかの結果に対して KCacheGrind を実行しようとしています。基本的にコードベースは、共有オブジェクトを起動して特定の機能を実行するプラグイン コンテナです。Callgrind を使用してこのアプリケーションをプロファイリングすると、ソース レベルではなく関数レベルでのコストを確認できます。
SO を起動する前に、プラグイン コンテナ コードをソース レベルで確認できますが、起動された SO に含まれるコードは確認できません。
デバッグ シンボルをオンにしてコンパイルしていることはわかっていますが、何らかの理由で、動的にロードされた SO ソース コードを表示できません。
ありがとう、
c++ - 呼び出された関数の Callgrind 時系列ログ
valgrind を使用して、できればテキスト ファイルで、C++ プログラムによって呼び出された関数の時系列ログを取得したいと考えています。
以下のサンプル C++ プログラム (simple.cpp) の場合:
取得したい
main() -> foo()-> bar->baz()*3
私が試したこと:
としてコンパイルしg++ -g simple.cpp -o simple.out
て実行valgrind --tool=callgrind ./simple.out
し、取得しますcallgrind.out.3519
実行callgrind_annotate --tree=both callgrind.out.3519 | grep baz
しても何も返されません。
関数kcachegrind callgrind.out.3519
のソース コード ビュー内を移動するとmain()
、呼び出しが時系列で表示されます。
この情報だけをログに書き出す方法はありますか?
valgrind - Callgrind の出力に関数呼び出しが含まれていない
同じファイルで宣言および実装された関数を呼び出す単純な .c プログラムがあります。gcc を使用してコンパイルします。
次に、callgrind で valgrind を使用して、callgrind.out.* ファイルを生成します。
次に、grind_annotate という呼び出しを使用します
しかし、結果は次のようになり、ファイルにある関数呼び出しは含まれません。別のCコードを試しましたが、同様の結果が得られました.理由は何ですか?
valgrind - 無限ループはありますか?
なしでプログラムを実行しましたが、valgrind
すぐに正常に終了しました。
を実行しようとするとcallgrind(valgrind --tool=callgrind)
、プログラムは終了しません (少なくとも 6 時間)。top
コマンド出力は次のとおりです。
プログラムがvalgrindで終了しないのはなぜですか?
linux - LibreOffice:印刷を担当するソースコード部分を決定する
LibreOffice 印刷プロセスにいくつかの追加機能を実装しようとしています (すべての印刷ページのマージンに特別な情報を自動的に追加する必要があります)。LibreOffice 4.0.4 および Gnome 2.28 で RHEL 6.4 を使用しています。
私の目的は、LibreOffice とシステム コンポーネント間のデータ フローを調査し、どのソース コードが印刷を担当しているかを判断することです。その後、コードのこれらの部分を変更する必要があります。
次に、ソース コードの調査方法についてアドバイスが必要です。私はたくさんのツールを見つけました、そして私の観点から:
strace
非常に低レベルのようです。gprof
「-pg」CFLAGS で再コンパイルされたバイナリが必要です。LibreOfficeでそれを行う方法がわかりません。systemtap
システムコールのみをプローブできますね。callgrind
+Gprof2Dot
組み合わせると非常に良いが、奇妙な結果をもたらす (以下を参照)。
たとえば、視覚化されたcallgrind
出力からの呼び出しグラフは次のとおりです。Gprof2Dot
私はcallgrind
そのようなコマンドから始めました:
4 つの出力ファイルを受け取りました。
最後の 1 つ (pid 29812) は、実行中の LibreOffice Writer GUI アプリケーションに対応します (strace
および で決定しましたps aux
)。CTRL+PとOKボタンを押しました。次に、プロセスの初期化をログに出力する機能を確認することを期待して、アプリケーションを閉じました。
callgrind
出力は、この回答に従ってツールで処理されましたGprof2Dot
。残念ながら、私が興味を持っているアクションもコール グラフもそのままの状態では、画像には表示されません。
このような問題を解決する適切な方法についての情報をいただければ幸いです。ありがとうございました。
valgrind - spawn-fcgi を使用した callgrind がプロファイリング データを作成しない
spawn-fcgi で始まる C++ アプリケーションをプロファイリングする必要があります。callgrind を使用しようとしましたが、KCachegrind の callgrind 出力にアプリケーションの情報が表示されません。
このコマンドは 10012 と 10013 の 2 つのファイルを作成しますが、2 番目のファイルは空です。最初のファイルには、場所 spawn-fcgi、ld-2.*.so、および libc の関数情報が含まれています。
アプリケーションのプロファイリング情報を取得するための正しいオプションを提案してください。