2013-12-13 58 views
1

我試圖根據以下文檔http://developer.android.com/tools/debugging/debugging-tracing.html#creatingtracefiles爲使用Debug.startMethodTracing(on activity onCreate)和Debug.stopMethodTracing(on activity onDestroy)上的應用程序生成跟蹤文件。Android調試跟蹤不包含特定於應用程序的方法調用

我在物理設備上運行應用程序,併成功創建跟蹤文件。後來我在它們上運行dmtracedump來生成一個調用堆棧圖,但它不包含我的任何應用程序方法調用。

爲了測試這一點,我創建了一個簡單的Android應用程序,加入debbuggable到清單:

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

創建兩個測試類A和B. A類有兩個方法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(); 
}} 

最後在上鄰的主要活動n創建和的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(); 
} 

我希望得到至少抗體()和AC()方法調用堆棧圖要求,但運行後:

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

生成調用關係圖如下:

enter image description here

這是它是如何工作的,即只顯示Android的電話,而不是應用程序的方法調用,鄰我是否錯過了什麼?

請注意,我最感興趣的是檢索方法執行的獨佔和包含時間。

回答

0

這可能是因爲(默認情況下)traceview的-t選項設置爲20%。從AndroidStudio dmtracedump

-t:爲了在圖形(孩子的包容性時間的父母包容時間的百分比)的子節點最低門檻。如果 未使用此選項,則默認閾值爲20%。

如果你打開你的跟蹤文件與traceview你會看到你的圖形是一樣的東西:

  • 你的圖形的第一個節點是第一個方法調用
  • 你圖的第二是第一次調用的traceview第一個孩子
  • 你圖的第三個是第一個方法調用
  • 等的孩子的第一個孩子...

用-t 0運行dmtracedump(如下),你應該看到所有的方法。

dmtracedump -t 0 debugtest.trace -g tree.png 
0

您可以通過放置e.getStacktrace()或在您的類中使用日誌來獲得更多信息。我發現明確地詢問錯誤比希望代碼只會來找你更容易。當然,也許有更好的方法,但這是我一直在做的一段時間,我已經能夠得到一個非常一致和容易的精確結果。

+0

感謝您的回答,但我更感興趣的包容性/排他性時間(即使與開銷)和調用圖。此外,我不想更改任何代碼,除了調試函數調用。 – 4knahs