Loading cmds/atrace/atrace.cpp +33 −9 Original line number Diff line number Diff line Loading @@ -450,8 +450,8 @@ static bool isTraceClock(const char *mode) return false; } char buf[4097]; ssize_t n = read(fd, buf, 4096); char buf[100]; ssize_t n = read(fd, buf, 99); close(fd); if (n == -1) { fprintf(stderr, "error reading %s: %s (%d)\n", k_traceClockPath, Loading @@ -475,13 +475,38 @@ static bool isTraceClock(const char *mode) return strcmp(mode, start) == 0; } // Enable or disable the kernel's use of the global clock. Disabling the global // clock will result in the kernel using a per-CPU local clock. // Read the trace_clock sysfs file and return true if it contains the requested // value. The trace_clock file format is: // local [global] counter uptime perf static bool traceClockContains(const char *mode) { int fd = open((g_traceFolder + k_traceClockPath).c_str(), O_RDONLY); if (fd == -1) { fprintf(stderr, "error opening %s: %s (%d)\n", k_traceClockPath, strerror(errno), errno); return false; } char buf[100]; ssize_t n = read(fd, buf, 99); close(fd); if (n == -1) { fprintf(stderr, "error reading %s: %s (%d)\n", k_traceClockPath, strerror(errno), errno); return false; } buf[n] = '\0'; return strstr(buf, mode) != NULL; } // Set the clock to the best available option while tracing. Use 'boot' if it's // available; otherwise, use 'mono'. // Any write to the trace_clock sysfs file will reset the buffer, so only // update it if the requested value is not the current value. static bool setGlobalClockEnable(bool enable) static bool setClock() { const char *clock = enable ? "global" : "local"; const char* clock = traceClockContains("boot") ? "boot" : "mono"; if (isTraceClock(clock)) { return true; Loading Loading @@ -783,7 +808,7 @@ static bool setUpTrace() ok &= setCategoriesEnableFromFile(g_categoriesFile); ok &= setTraceOverwriteEnable(g_traceOverwrite); ok &= setTraceBufferSizeKB(g_traceBufferSizeKB); ok &= setGlobalClockEnable(true); ok &= setClock(); ok &= setPrintTgidEnableIfPresent(true); ok &= setKernelTraceFuncs(g_kernelTraceFuncs); Loading Loading @@ -859,7 +884,6 @@ static void cleanUpTrace() // Set the options back to their defaults. setTraceOverwriteEnable(true); setTraceBufferSizeKB(1); setGlobalClockEnable(false); setPrintTgidEnableIfPresent(false); setKernelTraceFuncs(NULL); } Loading Loading @@ -1210,7 +1234,7 @@ int main(int argc, char **argv) if (ok && traceStart) { if (!traceStream) { printf("capturing trace..."); printf("capturing trace...\n"); fflush(stdout); } Loading cmds/atrace/atrace.rc +4 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,10 @@ on post-fs write /sys/kernel/debug/tracing/tracing_on 0 write /sys/kernel/tracing/tracing_on 0 # Set the trace clock to boot if it exists, falling back to mono if not. write /d/tracing/trace_clock mono write /d/tracing/trace_clock boot # Allow only the shell group to read and truncate the kernel trace. chown root shell /sys/kernel/debug/tracing/trace chown root shell /sys/kernel/tracing/trace Loading Loading
cmds/atrace/atrace.cpp +33 −9 Original line number Diff line number Diff line Loading @@ -450,8 +450,8 @@ static bool isTraceClock(const char *mode) return false; } char buf[4097]; ssize_t n = read(fd, buf, 4096); char buf[100]; ssize_t n = read(fd, buf, 99); close(fd); if (n == -1) { fprintf(stderr, "error reading %s: %s (%d)\n", k_traceClockPath, Loading @@ -475,13 +475,38 @@ static bool isTraceClock(const char *mode) return strcmp(mode, start) == 0; } // Enable or disable the kernel's use of the global clock. Disabling the global // clock will result in the kernel using a per-CPU local clock. // Read the trace_clock sysfs file and return true if it contains the requested // value. The trace_clock file format is: // local [global] counter uptime perf static bool traceClockContains(const char *mode) { int fd = open((g_traceFolder + k_traceClockPath).c_str(), O_RDONLY); if (fd == -1) { fprintf(stderr, "error opening %s: %s (%d)\n", k_traceClockPath, strerror(errno), errno); return false; } char buf[100]; ssize_t n = read(fd, buf, 99); close(fd); if (n == -1) { fprintf(stderr, "error reading %s: %s (%d)\n", k_traceClockPath, strerror(errno), errno); return false; } buf[n] = '\0'; return strstr(buf, mode) != NULL; } // Set the clock to the best available option while tracing. Use 'boot' if it's // available; otherwise, use 'mono'. // Any write to the trace_clock sysfs file will reset the buffer, so only // update it if the requested value is not the current value. static bool setGlobalClockEnable(bool enable) static bool setClock() { const char *clock = enable ? "global" : "local"; const char* clock = traceClockContains("boot") ? "boot" : "mono"; if (isTraceClock(clock)) { return true; Loading Loading @@ -783,7 +808,7 @@ static bool setUpTrace() ok &= setCategoriesEnableFromFile(g_categoriesFile); ok &= setTraceOverwriteEnable(g_traceOverwrite); ok &= setTraceBufferSizeKB(g_traceBufferSizeKB); ok &= setGlobalClockEnable(true); ok &= setClock(); ok &= setPrintTgidEnableIfPresent(true); ok &= setKernelTraceFuncs(g_kernelTraceFuncs); Loading Loading @@ -859,7 +884,6 @@ static void cleanUpTrace() // Set the options back to their defaults. setTraceOverwriteEnable(true); setTraceBufferSizeKB(1); setGlobalClockEnable(false); setPrintTgidEnableIfPresent(false); setKernelTraceFuncs(NULL); } Loading Loading @@ -1210,7 +1234,7 @@ int main(int argc, char **argv) if (ok && traceStart) { if (!traceStream) { printf("capturing trace..."); printf("capturing trace...\n"); fflush(stdout); } Loading
cmds/atrace/atrace.rc +4 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,10 @@ on post-fs write /sys/kernel/debug/tracing/tracing_on 0 write /sys/kernel/tracing/tracing_on 0 # Set the trace clock to boot if it exists, falling back to mono if not. write /d/tracing/trace_clock mono write /d/tracing/trace_clock boot # Allow only the shell group to read and truncate the kernel trace. chown root shell /sys/kernel/debug/tracing/trace chown root shell /sys/kernel/tracing/trace Loading