| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package dalvik.system; |
| |
| import java.io.FileDescriptor; |
| import java.io.IOException; |
| |
| /** |
| * Provides access to some VM-specific debug features. Though this class and |
| * many of its members are public, this class is meant to be wrapped in a more |
| * friendly way for use by application developers. On the Android platform, the |
| * recommended way to access this functionality is through the class |
| * <code>android.os.Debug</code>. |
| * |
| * @cts Please complete the spec. |
| * |
| * @deprecated this is an internal Dalvik class that is not appropriate for |
| * general use. It will be removed from the public API in a future release. |
| */ |
| public final class VMDebug { |
| /** |
| * Specifies the default method trace data file name. |
| * |
| * @deprecated only used in one place, which is unused and deprecated |
| */ |
| static public final String DEFAULT_METHOD_TRACE_FILE_NAME = "/sdcard/dmtrace.trace"; |
| |
| /** |
| * flag for startMethodTracing(), which adds the results from |
| * startAllocCounting to the trace key file. |
| */ |
| public static final int TRACE_COUNT_ALLOCS = 1; |
| |
| /* constants for getAllocCount */ |
| private static final int KIND_ALLOCATED_OBJECTS = 1<<0; |
| private static final int KIND_ALLOCATED_BYTES = 1<<1; |
| private static final int KIND_FREED_OBJECTS = 1<<2; |
| private static final int KIND_FREED_BYTES = 1<<3; |
| private static final int KIND_GC_INVOCATIONS = 1<<4; |
| private static final int KIND_CLASS_INIT_COUNT = 1<<5; |
| private static final int KIND_CLASS_INIT_TIME = 1<<6; |
| private static final int KIND_EXT_ALLOCATED_OBJECTS = 1<<12; |
| private static final int KIND_EXT_ALLOCATED_BYTES = 1<<13; |
| private static final int KIND_EXT_FREED_OBJECTS = 1<<14; |
| private static final int KIND_EXT_FREED_BYTES = 1<<15; |
| |
| public static final int KIND_GLOBAL_ALLOCATED_OBJECTS = |
| KIND_ALLOCATED_OBJECTS; |
| public static final int KIND_GLOBAL_ALLOCATED_BYTES = |
| KIND_ALLOCATED_BYTES; |
| public static final int KIND_GLOBAL_FREED_OBJECTS = |
| KIND_FREED_OBJECTS; |
| public static final int KIND_GLOBAL_FREED_BYTES = |
| KIND_FREED_BYTES; |
| public static final int KIND_GLOBAL_GC_INVOCATIONS = |
| KIND_GC_INVOCATIONS; |
| public static final int KIND_GLOBAL_CLASS_INIT_COUNT = |
| KIND_CLASS_INIT_COUNT; |
| public static final int KIND_GLOBAL_CLASS_INIT_TIME = |
| KIND_CLASS_INIT_TIME; |
| public static final int KIND_GLOBAL_EXT_ALLOCATED_OBJECTS = |
| KIND_EXT_ALLOCATED_OBJECTS; |
| public static final int KIND_GLOBAL_EXT_ALLOCATED_BYTES = |
| KIND_EXT_ALLOCATED_BYTES; |
| public static final int KIND_GLOBAL_EXT_FREED_OBJECTS = |
| KIND_EXT_FREED_OBJECTS; |
| public static final int KIND_GLOBAL_EXT_FREED_BYTES = |
| KIND_EXT_FREED_BYTES; |
| |
| public static final int KIND_THREAD_ALLOCATED_OBJECTS = |
| KIND_ALLOCATED_OBJECTS << 16; |
| public static final int KIND_THREAD_ALLOCATED_BYTES = |
| KIND_ALLOCATED_BYTES << 16; |
| public static final int KIND_THREAD_FREED_OBJECTS = |
| KIND_FREED_OBJECTS << 16; |
| public static final int KIND_THREAD_FREED_BYTES = |
| KIND_FREED_BYTES << 16; |
| public static final int KIND_THREAD_GC_INVOCATIONS = |
| KIND_GC_INVOCATIONS << 16; |
| public static final int KIND_THREAD_CLASS_INIT_COUNT = |
| KIND_CLASS_INIT_COUNT << 16; |
| public static final int KIND_THREAD_CLASS_INIT_TIME = |
| KIND_CLASS_INIT_TIME << 16; |
| public static final int KIND_THREAD_EXT_ALLOCATED_OBJECTS = |
| KIND_EXT_ALLOCATED_OBJECTS << 16; |
| public static final int KIND_THREAD_EXT_ALLOCATED_BYTES = |
| KIND_EXT_ALLOCATED_BYTES << 16; |
| public static final int KIND_THREAD_EXT_FREED_OBJECTS = |
| KIND_EXT_FREED_OBJECTS << 16; |
| public static final int KIND_THREAD_EXT_FREED_BYTES = |
| KIND_EXT_FREED_BYTES << 16; |
| |
| public static final int KIND_ALL_COUNTS = 0xffffffff; |
| |
| /* all methods are static */ |
| private VMDebug() {} |
| |
| /** |
| * Returns the time since the last known debugger activity. |
| * |
| * @return the time in milliseconds, or -1 if the debugger is not connected |
| */ |
| public static native long lastDebuggerActivity(); |
| |
| /** |
| * Determines if debugging is enabled in this VM. If debugging is not |
| * enabled, a debugger cannot be attached. |
| * |
| * @return true if debugging is enabled |
| */ |
| public static native boolean isDebuggingEnabled(); |
| |
| /** |
| * Determines if a debugger is currently attached. |
| * |
| * @return true if (and only if) a debugger is connected |
| */ |
| public static native boolean isDebuggerConnected(); |
| |
| /** |
| * Returns an array of strings that identify VM features. This is |
| * used by DDMS to determine what sorts of operations the VM can |
| * perform. |
| * |
| * @hide |
| */ |
| public static native String[] getVmFeatureList(); |
| |
| /** |
| * Start method tracing with default name, size, and with <code>0</code> |
| * flags. |
| * |
| * @deprecated not used, not needed |
| */ |
| public static void startMethodTracing() { |
| startMethodTracing(DEFAULT_METHOD_TRACE_FILE_NAME, 0, 0); |
| } |
| |
| /** |
| * Start method tracing, specifying a file name as well as a default |
| * buffer size. See <a |
| * href="{@docRoot}guide/developing/tools/traceview.html"> Running the |
| * Traceview Debugging Program</a> for information about reading |
| * trace files. |
| * |
| * <p>You can use either a fully qualified path and |
| * name, or just a name. If only a name is specified, the file will |
| * be created under the /sdcard/ directory. If a name is not given, |
| * the default is /sdcard/dmtrace.trace.</p> |
| * |
| * @param traceFileName name to give the trace file |
| * @param bufferSize the maximum size of both files combined. If passed |
| * as <code>0</code>, it defaults to 8MB. |
| * @param flags flags to control method tracing. The only one that |
| * is currently defined is {@link #TRACE_COUNT_ALLOCS}. |
| */ |
| public static void startMethodTracing(String traceFileName, |
| int bufferSize, int flags) { |
| |
| if (traceFileName == null) { |
| throw new NullPointerException(); |
| } |
| |
| startMethodTracingNative(traceFileName, null, bufferSize, flags); |
| } |
| |
| /** |
| * Like startMethodTracing(String, int, int), but taking an already-opened |
| * FileDescriptor in which the trace is written. The file name is also |
| * supplied simply for logging. Makes a dup of the file descriptor. |
| * |
| * Not exposed in the SDK unless we are really comfortable with supporting |
| * this and find it would be useful. |
| * @hide |
| */ |
| public static void startMethodTracing(String traceFileName, |
| FileDescriptor fd, int bufferSize, int flags) |
| { |
| if (traceFileName == null || fd == null) { |
| throw new NullPointerException(); |
| } |
| |
| startMethodTracingNative(traceFileName, fd, bufferSize, flags); |
| } |
| |
| /** |
| * 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) { |
| startMethodTracingNative(null, null, bufferSize, flags); |
| } |
| |
| /** |
| * Implements all startMethodTracing variants. |
| * |
| * @hide |
| */ |
| private static native void startMethodTracingNative(String traceFileName, |
| FileDescriptor fd, int bufferSize, int flags); |
| |
| /** |
| * Determine whether method tracing is currently active. |
| * @hide |
| */ |
| public static native boolean isMethodTracingActive(); |
| |
| /** |
| * Stops method tracing. |
| */ |
| public static native void stopMethodTracing(); |
| |
| /** |
| * Starts sending Dalvik method trace info to the emulator. |
| */ |
| public static native void startEmulatorTracing(); |
| |
| /** |
| * Stops sending Dalvik method trace info to the emulator. |
| */ |
| public static native void stopEmulatorTracing(); |
| |
| /** |
| * Get an indication of thread CPU usage. The value returned indicates the |
| * amount of time that the current thread has spent executing code or |
| * waiting for certain types of I/O. |
| * <p> |
| * The time is expressed in nanoseconds, and is only meaningful when |
| * compared to the result from an earlier call. Note that nanosecond |
| * resolution does not imply nanosecond accuracy. |
| * |
| * @return the CPU usage. A value of -1 means the system does not support |
| * this feature. |
| */ |
| public static native long threadCpuTimeNanos(); |
| |
| /** |
| * Count the number and aggregate size of memory allocations between |
| * two points. |
| */ |
| public static native void startAllocCounting(); |
| public static native void stopAllocCounting(); |
| public static native int getAllocCount(int kind); |
| public static native void resetAllocCount(int kinds); |
| |
| /** |
| * Establishes an object allocation limit in the current thread. Useful for |
| * catching regressions in code that is expected to operate without causing |
| * any allocations. The limit is valid from the return of this method until |
| * it is either changed or the thread terminates. |
| * |
| * @param limit |
| * the new limit. A value of 0 means not a single new object may |
| * be allocated. A value of -1 disables the limit. |
| * |
| * @return the previous limit, or -1 if no limit was set |
| * |
| * @see #setGlobalAllocationLimit(int) |
| */ |
| public static native int setAllocationLimit(int limit); |
| |
| /** |
| * Establishes an object allocation limit for the entire VM. Useful for |
| * catching regressions in code that is expected to operate without causing |
| * any allocations. The limit is valid from the return of this method until |
| * it is either changed or the thread terminates. |
| * |
| * @param limit |
| * the new limit. A value of 0 means not a single new object may |
| * be allocated. A value of -1 disables the limit. |
| * |
| * @return the previous limit, or -1 if no limit was set |
| * |
| * @see #setAllocationLimit(int) |
| */ |
| public static native int setGlobalAllocationLimit(int limit); |
| |
| /** |
| * Count the number of instructions executed between two points. |
| */ |
| public static native void startInstructionCounting(); |
| public static native void stopInstructionCounting(); |
| public static native void getInstructionCount(int[] counts); |
| public static native void resetInstructionCount(); |
| |
| /** |
| * Dumps a list of loaded class to the log file. |
| */ |
| public static native void printLoadedClasses(int flags); |
| |
| /** |
| * Gets the number of loaded classes. |
| * |
| * @return the number of loaded classes |
| */ |
| public static native int getLoadedClassCount(); |
| |
| /** |
| * Dump "hprof" data to the specified file. This will cause a GC. |
| * |
| * The VM may create a temporary file in the same directory. |
| * |
| * @param fileName Full pathname of output file (e.g. "/sdcard/dump.hprof"). |
| * @throws UnsupportedOperationException if the VM was built without |
| * HPROF support. |
| * @throws IOException if an error occurs while opening or writing files. |
| */ |
| public static native void dumpHprofData(String fileName) throws IOException; |
| |
| /** |
| * Collect "hprof" and send it to DDMS. This will cause a GC. |
| * |
| * @throws UnsupportedOperationException if the VM was built without |
| * HPROF support. |
| * |
| * @hide |
| */ |
| public static native void dumpHprofDataDdms(); |
| |
| /** |
| * Primes the register map cache. |
| * |
| * @hide |
| */ |
| public static native boolean cacheRegisterMap(String classAndMethodDesc); |
| |
| /** |
| * Dumps the contents of the VM reference tables (e.g. JNI locals and |
| * globals) to the log file. |
| * |
| * @hide |
| */ |
| public static native void dumpReferenceTables(); |
| |
| /** |
| * Crashes the VM. Seriously. Dumps the interpreter stack trace for |
| * the current thread and then aborts the VM so you can see the native |
| * stack trace. Useful for figuring out how you got somewhere when |
| * lots of native code is involved. |
| * |
| * @hide |
| */ |
| public static native void crash(); |
| |
| /* |
| * Fake method, inserted into dmtrace output when the garbage collector |
| * runs. Not actually called. |
| */ |
| private static void startGC() {} |
| |
| /* |
| * Fake method, inserted into dmtrace output during class preparation |
| * (loading and linking, but not verification or initialization). Not |
| * actually called. |
| */ |
| private static void startClassPrep() {} |
| } |