/*
 * static void startMethodTracingFd(String traceFileName, FileDescriptor fd,
 *     int bufferSize, int flags, boolean samplingEnabled, int intervalUs)
 *
 * Start method trace profiling, sending results to a file descriptor.
 */
static void Dalvik_dalvik_system_VMDebug_startMethodTracingFd(const u4* args,
    JValue* pResult)
{
    StringObject* traceFileStr = (StringObject*) args[0];
    Object* traceFd = (Object*) args[1];
    int bufferSize = args[2];
    int flags = args[3];
    bool samplingEnabled = args[4];
    int intervalUs = args[5];

    int origFd = getFileDescriptor(traceFd);
    if (origFd < 0)
        RETURN_VOID();

    int fd = dup(origFd);
    if (fd < 0) {
        dvmThrowExceptionFmt(gDvm.exRuntimeException,
            "dup(%d) failed: %s", origFd, strerror(errno));
        RETURN_VOID();
    }

    char* traceFileName = dvmCreateCstrFromString(traceFileStr);
    if (traceFileName == NULL) {
        RETURN_VOID();
    }

    dvmMethodTraceStart(traceFileName, fd, bufferSize, flags, false,
        samplingEnabled, intervalUs);
    free(traceFileName);
    RETURN_VOID();
}
/*
 * static void startMethodTracingDdmsImpl(int bufferSize, int flags,
 *     boolean samplingEnabled, int intervalUs)
 *
 * Start method trace profiling, sending results directly to DDMS.
 */
static void Dalvik_dalvik_system_VMDebug_startMethodTracingDdmsImpl(const u4* args,
    JValue* pResult)
{
    int bufferSize = args[0];
    int flags = args[1];
    bool samplingEnabled = args[2];
    int intervalUs = args[3];
    dvmMethodTraceStart("[DDMS]", -1, bufferSize, flags, true, samplingEnabled,
        intervalUs);
    RETURN_VOID();
}
/*
 * static void startMethodTracingFilename(String traceFileName, int bufferSize,
 *     int flags, boolean samplingEnabled, int intervalUs)
 *
 * Start method trace profiling, sending results to a file.
 */
static void Dalvik_dalvik_system_VMDebug_startMethodTracingFilename(const u4* args,
    JValue* pResult)
{
    StringObject* traceFileStr = (StringObject*) args[0];
    int bufferSize = args[1];
    int flags = args[2];
    bool samplingEnabled = args[3];
    int intervalUs = args[4];

    char* traceFileName = dvmCreateCstrFromString(traceFileStr);
    if (traceFileName == NULL) {
        RETURN_VOID();
    }

    dvmMethodTraceStart(traceFileName, -1, bufferSize, flags, false,
        samplingEnabled, intervalUs);
    free(traceFileName);
    RETURN_VOID();
}
Exemplo n.º 4
0
/*
 * static void startMethodTracingNative(String traceFileName,
 *     FileDescriptor fd, int bufferSize, int flags)
 *
 * Start method trace profiling.
 *
 * If both "traceFileName" and "fd" are null, the result will be sent
 * directly to DDMS.  (The non-DDMS versions of the calls are expected
 * to enforce non-NULL filenames.)
 */
static void Dalvik_dalvik_system_VMDebug_startMethodTracingNative(const u4* args,
    JValue* pResult)
{
    StringObject* traceFileStr = (StringObject*) args[0];
    Object* traceFd = (Object*) args[1];
    int bufferSize = args[2];
    int flags = args[3];

    if (bufferSize == 0) {
        // Default to 8MB per the documentation.
        bufferSize = 8 * 1024 * 1024;
    }

    if (bufferSize < 1024) {
        dvmThrowException("Ljava/lang/IllegalArgumentException;", NULL);
        RETURN_VOID();
    }

    char* traceFileName = NULL;
    if (traceFileStr != NULL)
        traceFileName = dvmCreateCstrFromString(traceFileStr);

    int fd = -1;
    if (traceFd != NULL) {
        int origFd = getFileDescriptor(traceFd);
        if (origFd < 0)
            RETURN_VOID();

        fd = dup(origFd);
        if (fd < 0) {
            dvmThrowExceptionFmt("Ljava/lang/RuntimeException;",
                "dup(%d) failed: %s", origFd, strerror(errno));
            RETURN_VOID();
        }
    }

    dvmMethodTraceStart(traceFileName != NULL ? traceFileName : "[DDMS]",
        fd, bufferSize, flags, (traceFileName == NULL && fd == -1));
    free(traceFileName);
    RETURN_VOID();
}