Skip to content
This repository has been archived by the owner on Nov 8, 2023. It is now read-only.

Commit

Permalink
Improve logging.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
DanAlbert committed May 21, 2015
1 parent 3647376 commit 9313c0d
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 21 deletions.
45 changes: 33 additions & 12 deletions adb/adb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include <vector>
#include <unordered_map>

#include <base/logging.h>
#include <base/stringprintf.h>
#include <base/strings.h>

Expand All @@ -50,16 +51,25 @@
#include <sys/mount.h>
#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: ");
Expand All @@ -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));
Expand All @@ -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();
Expand All @@ -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());
Expand Down Expand Up @@ -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<std::string, int> trace_flags = {
Expand Down Expand Up @@ -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)
Expand Down
6 changes: 3 additions & 3 deletions adb/adb_trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
4 changes: 1 addition & 3 deletions adb/client/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<const char**>(argv + 1));
}
4 changes: 1 addition & 3 deletions adb/daemon/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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'},
Expand Down Expand Up @@ -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. */
Expand Down

0 comments on commit 9313c0d

Please sign in to comment.