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

* commit '38e1bb8617ee6b7913b9b7b7c40e43338ea5c947':
  libcutils: add support for app tracing
This commit is contained in:
Jamie Gennis 2013-03-28 14:04:50 -07:00 committed by Android Git Automerger
commit 15311e0830
2 changed files with 96 additions and 6 deletions

View file

@ -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.

View file

@ -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>
@ -29,11 +30,81 @@
#define LOG_TAG "cutils-trace"
#include <cutils/log.h>
int32_t atrace_is_ready = 0;
int atrace_marker_fd = -1;
uint64_t atrace_enabled_tags = ATRACE_TAG_NOT_READY;
static pthread_once_t atrace_once_control = PTHREAD_ONCE_INIT;
static pthread_mutex_t atrace_tags_mutex = PTHREAD_MUTEX_INITIALIZER;
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;
}