1

次のドキュメントhttp://developer.android.com/tools/debugging/debuggingに従って、Debug.startMethodTracing (アクティビティ onCreate) と Debug.stopMethodTracing (アクティビティ onDestroy) を使用して、アプリケーションのトレース ファイルを生成しようとしています。-tracing.html#creatingtracefiles .

物理デバイスでアプリケーションを実行すると、トレース ファイルが正常に作成されます。後でそれらに対して dmtracedump を実行してコール スタック ダイアグラムを生成しましたが、アプリケーション メソッドの呼び出しは含まれていません。

これをテストするために、単純な Android アプリケーションを作成し、マニフェストにデバッガブルを追加しました。

 <application
    ... 
    android:debuggable="true">

2 つのテスト クラス A と B を作成しました。クラス A には 2 つのメソッド b() と c() があります。

public class A {

private int _i;

public A(){_i=0;}

public void b(){c();}
public void c(){for(int k=0;k<20;k++)_i++;}}

クラス B には単一のメソッド c() があります。

public class B {

public void c(){
    (new A()).b();
    A d = new A();
    d.c();
}}

最後に、onCreate メソッドと onDestroy メソッドのメイン アクティビティで、トレースを開始しました。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Debug.startMethodTracing("debugtest");

    A a;
    for (int i = 0; i < 20; i++) {
        a = new A();
        a.b();
        a.c();
    }

    (new B()).c();
}

@Override
public void onDestroy() {
    super.onDestroy();
    Debug.stopMethodTracing();
}

コールスタックダイアグラムで少なくとも Ab() および Ac() メソッド呼び出しを取得することを望んでいましたが、実行後:

adb pull sdcard/debugtest.trace . ; dmtracedump debugtest.trace -g tree.png

生成されたコール グラフは次のとおりです。

ここに画像の説明を入力

これはどのように機能するはずですか、つまり、アプリケーションメソッドの呼び出しではなく、Android の呼び出しを表示するだけですか、それとも何か不足していますか?

メソッド実行の排他的および包括的時間を取得することに主に関心があることに注意してください。

4

2 に答える 2

0

e.getStacktrace() を配置するか、クラスで Log を使用すると、より多くの情報を取得できます。コードが届くことを期待するよりも、エラーを明示的に尋ねる方が簡単だと思います。もちろん、もっと良い方法があるかもしれませんが、それが私がしばらくの間行ってきた方法であり、非常に一貫した、特定しやすい結果を得ることができました.

于 2013-12-13T18:47:26.567 に答える
0

(デフォルトで) traceview の -t オプションが 20% に設定されていることが原因である可能性があります。AndroidStudio dmtracedumpから

-t : グラフに子ノードを含めるための最小しきい値 (親の包括時間に対する子の包括時間のパーセンテージ)。このオプションを使用しない場合、デフォルトのしきい値は 20% です。

traceview でトレース ファイルを開くと、グラフが次のようになっていることがわかります。

  • グラフの最初のノードは最初のメソッド呼び出しです
  • グラフの 2 番目は、traceview の最初の呼び出しの最初の子です
  • グラフの 3 番目は、最初のメソッド呼び出しの子の最初の子です
  • 等々...

(次のように) -t 0 を指定して dmtracedump を実行すると、すべてのメソッドが表示されます。

dmtracedump -t 0 debugtest.trace -g tree.png
于 2017-01-10T18:20:54.143 に答える