summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Andy McFadden <fadden@android.com> 2010-01-22 12:20:41 -0800
committer Andy McFadden <fadden@android.com> 2010-01-27 14:48:41 -0800
commit72a20db0c71c6bddaa9fd2e4046242fc9d540e1c (patch)
treebc74353f862fc54b1e7e12831df1353734747d81
parent02735bc9b7686e56957cdec9c10660c4a6dd1090 (diff)
Add streaming method profiling support.
This adds a new (hidden) startMethodTracingDdms call. It's like the normal method tracing calls, but you don't specify an output file. Instead, when tracing stops, the data is sent directly to DDMS. This also adds handlers for the MPSS/MPSE requests that DDMS sends.
-rw-r--r--core/java/android/ddm/DdmHandleProfiling.java52
-rw-r--r--core/java/android/os/Debug.java11
2 files changed, 63 insertions, 0 deletions
diff --git a/core/java/android/ddm/DdmHandleProfiling.java b/core/java/android/ddm/DdmHandleProfiling.java
index beed50507fa2..63ee445e4271 100644
--- a/core/java/android/ddm/DdmHandleProfiling.java
+++ b/core/java/android/ddm/DdmHandleProfiling.java
@@ -32,6 +32,8 @@ public class DdmHandleProfiling extends ChunkHandler {
public static final int CHUNK_MPRS = type("MPRS");
public static final int CHUNK_MPRE = type("MPRE");
+ public static final int CHUNK_MPSS = type("MPSS");
+ public static final int CHUNK_MPSE = type("MPSE");
public static final int CHUNK_MPRQ = type("MPRQ");
private static DdmHandleProfiling mInstance = new DdmHandleProfiling();
@@ -46,6 +48,8 @@ public class DdmHandleProfiling extends ChunkHandler {
public static void register() {
DdmServer.registerHandler(CHUNK_MPRS, mInstance);
DdmServer.registerHandler(CHUNK_MPRE, mInstance);
+ DdmServer.registerHandler(CHUNK_MPSS, mInstance);
+ DdmServer.registerHandler(CHUNK_MPSE, mInstance);
DdmServer.registerHandler(CHUNK_MPRQ, mInstance);
}
@@ -73,6 +77,10 @@ public class DdmHandleProfiling extends ChunkHandler {
return handleMPRS(request);
} else if (type == CHUNK_MPRE) {
return handleMPRE(request);
+ } else if (type == CHUNK_MPSS) {
+ return handleMPSS(request);
+ } else if (type == CHUNK_MPSE) {
+ return handleMPSE(request);
} else if (type == CHUNK_MPRQ) {
return handleMPRQ(request);
} else {
@@ -124,6 +132,50 @@ public class DdmHandleProfiling extends ChunkHandler {
}
/*
+ * Handle a "Method Profiling w/Streaming Start" request.
+ */
+ private Chunk handleMPSS(Chunk request) {
+ ByteBuffer in = wrapChunk(request);
+
+ int bufferSize = in.getInt();
+ int flags = in.getInt();
+ if (Config.LOGV) {
+ Log.v("ddm-heap", "Method prof stream start: size=" + bufferSize
+ + ", flags=" + flags);
+ }
+
+ try {
+ Debug.startMethodTracingDdms(bufferSize, flags);
+ return null; // empty response
+ } catch (RuntimeException re) {
+ return createFailChunk(1, re.getMessage());
+ }
+ }
+
+ /*
+ * Handle a "Method Profiling w/Streaming End" request.
+ */
+ private Chunk handleMPSE(Chunk request) {
+ byte result;
+
+ if (Config.LOGV) {
+ Log.v("ddm-heap", "Method prof stream end");
+ }
+
+ try {
+ Debug.stopMethodTracing();
+ result = 0;
+ } catch (RuntimeException re) {
+ Log.w("ddm-heap", "Method prof stream end failed: "
+ + re.getMessage());
+ return createFailChunk(1, re.getMessage());
+ }
+
+ /* VM sent the (perhaps very large) response directly */
+ return null;
+ }
+
+ /*
* Handle a "Method PRofiling Query" request.
*/
private Chunk handleMPRQ(Chunk request) {
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index 7043c2e575a6..8e9b11bdcd32 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -469,6 +469,17 @@ href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Lo
}
/**
+ * Starts method tracing without a backing file. When stopMethodTracing
+ * is called, the result is sent directly to DDMS. (If DDMS is not
+ * attached when tracing ends, the profiling data will be discarded.)
+ *
+ * @hide
+ */
+ public static void startMethodTracingDdms(int bufferSize, int flags) {
+ VMDebug.startMethodTracingDdms(bufferSize, flags);
+ }
+
+ /**
* Determine whether method tracing is currently active.
* @hide
*/