2017-03-28 18 views
1

Googleのsimpleperfサンプリングプロファイラを使用してAndroid NDK 14b clangベースのアプリケーションをプロファイルしようとしています。記録されたコールスタックサンプルは実際には巻き戻されません。コールスタックの上部フレームだけが記録されているように見えるので、プロファイリングレポートはそれほど有用ではありません。ほとんどのコードで-fno-omit-frame-pointerを指定しましたが、これは違いはありません。Simpleperfがスタックを巻き戻さない

私には何が欠けていますか?私が使用しなければならないAndroid NDKプロジェクト用の最新のプロファイラがありますか?

答えて

2

フレームポインタベースの巻き戻し(--call-graph fpオプションを使用)を行っている場合、armにはアーム/サムコードを組み合わせているため、aarch64アーキテクチャを使用してください。-fno-どこでも省略フレームポインタ。

(-gまたは--call-graph dwarfオプションを使用して)ドワーフベースの巻戻しを行う場合、-fno-omit-frame-pointerは機能せず、デバッグ情報を含む共有ライブラリを使用することをお勧めします。 apk。

Javaコードで巻き戻しが停止する可能性もあります。 Javaコードを元に戻すには、それをネイティブコードに完全にコンパイルし、ドワーフベースの巻き戻しを使用する必要があります。

結局のところ、ndk r14bに含まれているapp_profiler.pyを使用することができます。あなたの詳細を処理し、Javaコードを完全にコンパイルし、デバッグ情報を含むライブラリをデバイスにダウンロードしようとします。また、環境内でうまく動作しない場合は、チェックして変更するのも簡単です。

1

いくつかのシンプルなオプションがありますが、これは予想されるコールグラフを得る可能性が高くなるように指定する(または指定しない)必要があることがわかりました。 たとえば、 '-a --cpu 1'を指定すると、プロファイリングしているバイナリはコールグラフに表示されません。私は(perf_text.x主にCPU 1上の1秒間スピン場所)を行う場合たとえば を:

simpleperf record -g -a -e cpu-cycles --cpu 1 ./perf_test.x -C 1 -w bw -t 1 
simpleperf report -g caller 

そしてperf_test.xは、出力に(私にとっては)まったく表示されません。 それを使用している場合は--cpu xオプションを削除してください。 また、高いサンプリングレートはオーバーヘッドを増加させます。以下は、現在のデフォルトサンプリングレート4000サンプル/秒で動作します。

simpleperf record -g -a -e cpu-cycles -F 4000 ./perf_test.x -C 1 -w bw -t 1 
simpleperf report -g caller 

上記は、サンプルの40~70%を使用するトッププロセスとしてのsimpleperfを示しています。 は、サンプリングレートを削減:総サンプルと第一simpleperfエントリの上部%までperf_test.x持ち込ま

simpleperf record -g -a -e cpu-cycles -F 1000 ./perf_test.x -C 1 -w bw -t 1 
simpleperf report -g caller 

は、全サンプルの24%に入ってきます。 これは役に立ちます。

関連する問題