Loading include/cutils/trace.h +11 −1 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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) Loading Loading @@ -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. Loading libcutils/trace.c +85 −5 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -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() { Loading @@ -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; } Loading Loading
include/cutils/trace.h +11 −1 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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) Loading Loading @@ -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. Loading
libcutils/trace.c +85 −5 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -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() { Loading @@ -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; } Loading