From 9313c0df20d7cc8ea6a074a3d53022c4b3b5ea05 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Thu, 21 May 2015 13:58:50 -0700 Subject: [PATCH] Improve logging. Any output from the LOG family will now go to stderr and logcat on the device. stderr is usually redirected to a log file, but that is now inhibited for adbd if being run from a tty (useful when debugging with the serial console). This also fixes sending logs to the file on device for the trace mask of "all". The "all" tag was specifically handled to return early from the function, preventing the file initialization from happening. Change-Id: Id253577bfd1500fbce92dbfba0f9be23dbfd5ee4 --- adb/adb.cpp | 45 +++++++++++++++++++++++++++++++++------------ adb/adb_trace.h | 6 +++--- adb/client/main.cpp | 4 +--- adb/daemon/main.cpp | 4 +--- 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/adb/adb.cpp b/adb/adb.cpp index 0e14213e0..2c959a441 100644 --- a/adb/adb.cpp +++ b/adb/adb.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #include @@ -50,16 +51,25 @@ #include #endif -ADB_MUTEX_DEFINE( D_lock ); +ADB_MUTEX_DEFINE(D_lock); int HOST = 0; #if !ADB_HOST -const char *adb_device_banner = "device"; +const char* adb_device_banner = "device"; +static android::base::LogdLogger gLogdLogger; #endif -void fatal(const char *fmt, ...) -{ +void AdbLogger(android::base::LogId id, android::base::LogSeverity severity, + const char* tag, const char* file, unsigned int line, + const char* message) { + android::base::StderrLogger(id, severity, tag, file, line, message); +#if !ADB_HOST + gLogdLogger(id, severity, tag, file, line, message); +#endif +} + +void fatal(const char *fmt, ...) { va_list ap; va_start(ap, fmt); fprintf(stderr, "error: "); @@ -69,8 +79,7 @@ void fatal(const char *fmt, ...) exit(-1); } -void fatal_errno(const char *fmt, ...) -{ +void fatal_errno(const char* fmt, ...) { va_list ap; va_start(ap, fmt); fprintf(stderr, "error: %s: ", strerror(errno)); @@ -81,7 +90,7 @@ void fatal_errno(const char *fmt, ...) } #if !ADB_HOST -void start_device_log(void) { +static std::string get_log_file_name() { struct tm now; time_t t; tzset(); @@ -91,13 +100,18 @@ void start_device_log(void) { char timestamp[PATH_MAX]; strftime(timestamp, sizeof(timestamp), "%Y-%m-%d-%H-%M-%S", &now); - std::string path = android::base::StringPrintf("/data/adb/adb-%s-%d", timestamp, getpid()); - int fd = unix_open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0640); + return android::base::StringPrintf("/data/adb/adb-%s-%d", timestamp, + getpid()); +} + +void start_device_log(void) { + int fd = unix_open(get_log_file_name().c_str(), + O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0640); if (fd == -1) { return; } - // redirect stdout and stderr to the log file + // Redirect stdout and stderr to the log file. dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); fprintf(stderr, "--- adb starting (pid %d) ---\n", getpid()); @@ -138,7 +152,7 @@ std::string get_trace_setting() { // // adb's trace setting comes from the ADB_TRACE environment variable, whereas // adbd's comes from the system property persist.adb.trace_mask. -void adb_trace_init() { +static void setup_trace_mask() { const std::string trace_setting = get_trace_setting(); std::unordered_map trace_flags = { @@ -173,10 +187,17 @@ void adb_trace_init() { adb_trace_mask |= 1 << flag->second; } } +} +void adb_trace_init(char** argv) { #if !ADB_HOST - start_device_log(); + if (isatty(STDOUT_FILENO) == 0) { + start_device_log(); + } #endif + + setup_trace_mask(); + android::base::InitLogging(argv, AdbLogger); } apacket* get_apacket(void) diff --git a/adb/adb_trace.h b/adb/adb_trace.h index 63d415149..dbc7ec83e 100644 --- a/adb/adb_trace.h +++ b/adb/adb_trace.h @@ -57,9 +57,9 @@ void adb_qemu_trace(const char* fmt, ...); #define DQ(...) ((void)0) #endif /* !ADB_HOST */ -extern int adb_trace_mask; -extern unsigned char adb_trace_output_count; -void adb_trace_init(void); +extern int adb_trace_mask; +extern unsigned char adb_trace_output_count; +void adb_trace_init(char**); # define ADB_TRACING ((adb_trace_mask & (1 << TRACE_TAG)) != 0) diff --git a/adb/client/main.cpp b/adb/client/main.cpp index f48182d07..0cd66704a 100644 --- a/adb/client/main.cpp +++ b/adb/client/main.cpp @@ -176,9 +176,7 @@ int adb_main(int is_daemon, int server_port) { int main(int argc, char** argv) { adb_sysdeps_init(); - - android::base::InitLogging(argv); - adb_trace_init(); + adb_trace_init(argv); D("Handling commandline()\n"); return adb_commandline(argc - 1, const_cast(argv + 1)); } diff --git a/adb/daemon/main.cpp b/adb/daemon/main.cpp index 99ff539b0..c0612cd10 100644 --- a/adb/daemon/main.cpp +++ b/adb/daemon/main.cpp @@ -230,8 +230,6 @@ static void close_stdin() { } int main(int argc, char** argv) { - android::base::InitLogging(argv); - while (true) { static struct option opts[] = { {"root_seclabel", required_argument, nullptr, 's'}, @@ -265,7 +263,7 @@ int main(int argc, char** argv) { close_stdin(); - adb_trace_init(); + adb_trace_init(argv); /* If adbd runs inside the emulator this will enable adb tracing via * adb-debug qemud service in the emulator. */