Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 15311e08 authored by Jamie Gennis's avatar Jamie Gennis Committed by Android Git Automerger
Browse files

am 38e1bb86: am 774f9299: libcutils: add support for app tracing

* commit '38e1bb86':
  libcutils: add support for app tracing
parents b9cbdbaf 38e1bb86
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <sys/cdefs.h>
#include <sys/types.h>
#include <stdint.h>
#include <stdbool.h>
#include <unistd.h>
#include <cutils/compiler.h>

@@ -62,7 +63,8 @@ __BEGIN_DECLS
#define ATRACE_TAG_VIDEO            (1<<9)
#define ATRACE_TAG_CAMERA           (1<<10)
#define ATRACE_TAG_HAL              (1<<11)
#define ATRACE_TAG_LAST             ATRACE_TAG_HAL
#define ATRACE_TAG_APP              (1<<12)
#define ATRACE_TAG_LAST             ATRACE_TAG_APP

// Reserved for initialization.
#define ATRACE_TAG_NOT_READY        (1LL<<63)
@@ -96,6 +98,14 @@ void atrace_setup();
 */
void atrace_update_tags();

/**
 * Set whether the process is debuggable.  By default the process is not
 * considered debuggable.  If the process is not debuggable then application-
 * level tracing is not allowed unless the ro.debuggable system property is
 * set to '1'.
 */
void atrace_set_debuggable(bool debuggable);

/**
 * Flag indicating whether setup has been completed, initialized to 0.
 * Nonzero indicates setup has completed.
+85 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <fcntl.h>
#include <limits.h>
#include <pthread.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
@@ -32,9 +33,79 @@
int32_t                atrace_is_ready      = 0;
int                    atrace_marker_fd     = -1;
uint64_t               atrace_enabled_tags  = ATRACE_TAG_NOT_READY;
static bool            atrace_is_debuggable = false;
static pthread_once_t  atrace_once_control  = PTHREAD_ONCE_INIT;
static pthread_mutex_t atrace_tags_mutex    = PTHREAD_MUTEX_INITIALIZER;

// Set whether this process is debuggable, which determines whether
// application-level tracing is allowed when the ro.debuggable system property
// is not set to '1'.
void atrace_set_debuggable(bool debuggable)
{
    atrace_is_debuggable = debuggable;
    atrace_update_tags();
}

// Check whether the given command line matches one of the comma-separated
// values listed in the app_cmdlines property.
static bool atrace_is_cmdline_match(const char* cmdline) {
    char value[PROPERTY_VALUE_MAX];
    char* start = value;

    property_get("debug.atrace.app_cmdlines", value, "");

    while (start != NULL) {
        char* end = strchr(start, ',');

        if (end != NULL) {
            *end = '\0';
            end++;
        }

        if (strcmp(cmdline, start) == 0) {
            return true;
        }

        start = end;
    }

    return false;
}

// Determine whether application-level tracing is enabled for this process.
static bool atrace_is_app_tracing_enabled()
{
    bool sys_debuggable = false;
    bool proc_debuggable = false;
    char value[PROPERTY_VALUE_MAX];
    bool result = false;

    // Check whether the system is debuggable.
    property_get("ro.debuggable", value, "0");
    if (value[0] == '1') {
        sys_debuggable = true;
    }

    if (sys_debuggable || atrace_is_debuggable) {
        // Check whether tracing is enabled for this process.
        FILE * file = fopen("/proc/self/cmdline", "r");
        if (file) {
            char cmdline[4096];
            if (fgets(cmdline, sizeof(cmdline), file)) {
                result = atrace_is_cmdline_match(cmdline);
            } else {
                ALOGE("Error reading cmdline: %s (%d)", strerror(errno), errno);
            }
            fclose(file);
        } else {
            ALOGE("Error opening /proc/self/cmdline: %s (%d)", strerror(errno),
                    errno);
        }
    }

    return result;
}

// Read the sysprop and return the value tags should be set to
static uint64_t atrace_get_property()
{
@@ -52,6 +123,15 @@ static uint64_t atrace_get_property()
        ALOGE("Error parsing trace property: Number too large: %s", value);
        return 0;
    }

    // Only set the "app" tag if this process was selected for app-level debug
    // tracing.
    if (atrace_is_app_tracing_enabled()) {
        tags |= ATRACE_TAG_APP;
    } else {
        tags &= ~ATRACE_TAG_APP;
    }

    return (tags | ATRACE_TAG_ALWAYS) & ATRACE_TAG_VALID_MASK;
}