Adb: use VLOG() to replace D() for verbose logging.

As there are too many D(), we can keep both VLOG() and D() now, and get
rid of D() gradually.

Change-Id: I2f1cb70bcab3e82c99fed939341d03f6b2216076
This commit is contained in:
Yabin Cui 2015-09-22 15:52:57 -07:00
parent 65744003a9
commit aed3c61c44
30 changed files with 253 additions and 219 deletions

View File

@ -37,6 +37,7 @@ LIBADB_SRC_FILES := \
adb_auth.cpp \
adb_io.cpp \
adb_listeners.cpp \
adb_trace.cpp \
adb_utils.cpp \
sockets.cpp \
transport.cpp \

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_ADB
#define TRACE_TAG ADB
#include "sysdeps.h"
#include "adb.h"
@ -32,7 +32,6 @@
#include <string>
#include <vector>
#include <unordered_map>
#include <base/logging.h>
#include <base/macros.h>
@ -53,22 +52,6 @@
#include <sys/mount.h>
#endif
#if !ADB_HOST
const char* adb_device_banner = "device";
static android::base::LogdLogger gLogdLogger;
#else
const char* adb_device_banner = "host";
#endif
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
}
std::string adb_version() {
// Don't change the format of this --- it's parsed by ddmlib.
return android::base::StringPrintf("Android Debug Bridge version %d.%d.%d\n"
@ -97,128 +80,6 @@ void fatal_errno(const char* fmt, ...) {
exit(-1);
}
#if !ADB_HOST
static std::string get_log_file_name() {
struct tm now;
time_t t;
tzset();
time(&t);
localtime_r(&t, &now);
char timestamp[PATH_MAX];
strftime(timestamp, sizeof(timestamp), "%Y-%m-%d-%H-%M-%S", &now);
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.
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
fprintf(stderr, "--- adb starting (pid %d) ---\n", getpid());
unix_close(fd);
}
#endif
int adb_trace_mask;
std::string get_trace_setting_from_env() {
const char* setting = getenv("ADB_TRACE");
if (setting == nullptr) {
setting = "";
}
return std::string(setting);
}
#if !ADB_HOST
std::string get_trace_setting_from_prop() {
char buf[PROPERTY_VALUE_MAX];
property_get("persist.adb.trace_mask", buf, "");
return std::string(buf);
}
#endif
std::string get_trace_setting() {
#if ADB_HOST
return get_trace_setting_from_env();
#else
return get_trace_setting_from_prop();
#endif
}
// Split the space separated list of tags from the trace setting and build the
// trace mask from it. note that '1' and 'all' are special cases to enable all
// tracing.
//
// adb's trace setting comes from the ADB_TRACE environment variable, whereas
// adbd's comes from the system property persist.adb.trace_mask.
static void setup_trace_mask() {
const std::string trace_setting = get_trace_setting();
if (trace_setting.empty()) {
return;
}
std::unordered_map<std::string, int> trace_flags = {
{"1", 0},
{"all", 0},
{"adb", TRACE_ADB},
{"sockets", TRACE_SOCKETS},
{"packets", TRACE_PACKETS},
{"rwx", TRACE_RWX},
{"usb", TRACE_USB},
{"sync", TRACE_SYNC},
{"sysdeps", TRACE_SYSDEPS},
{"transport", TRACE_TRANSPORT},
{"jdwp", TRACE_JDWP},
{"services", TRACE_SERVICES},
{"auth", TRACE_AUTH},
{"fdevent", TRACE_FDEVENT},
{"shell", TRACE_SHELL}};
std::vector<std::string> elements = android::base::Split(trace_setting, " ");
for (const auto& elem : elements) {
const auto& flag = trace_flags.find(elem);
if (flag == trace_flags.end()) {
D("Unknown trace flag: %s", elem.c_str());
continue;
}
if (flag->second == 0) {
// 0 is used for the special values "1" and "all" that enable all
// tracing.
adb_trace_mask = ~0;
return;
} else {
adb_trace_mask |= 1 << flag->second;
}
}
}
void adb_trace_init(char** argv) {
#if !ADB_HOST
// Don't open log file if no tracing, since this will block
// the crypto unmount of /data
if (!get_trace_setting().empty()) {
if (isatty(STDOUT_FILENO) == 0) {
start_device_log();
}
}
#endif
setup_trace_mask();
android::base::InitLogging(argv, AdbLogger);
D("%s", adb_version().c_str());
}
apacket* get_apacket(void)
{
apacket* p = reinterpret_cast<apacket*>(malloc(sizeof(apacket)));

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_ADB
#define TRACE_TAG ADB
#include "sysdeps.h"
#include "adb_auth.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_AUTH
#define TRACE_TAG AUTH
#include "sysdeps.h"
#include "adb_auth.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_AUTH
#define TRACE_TAG AUTH
#include "sysdeps.h"
#include "adb_auth.h"
@ -452,7 +452,6 @@ int adb_auth_get_userkey(unsigned char *data, size_t len)
}
int adb_auth_keygen(const char* filename) {
adb_trace_mask |= (1 << TRACE_AUTH);
return (generate_key(filename) == 0);
}

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_ADB
#define TRACE_TAG ADB
#include "sysdeps.h"
#include "adb_client.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_RWX
#define TRACE_TAG RWX
#include "adb_io.h"
@ -84,10 +84,8 @@ bool ReadFdExactly(int fd, void* buf, size_t len) {
}
}
D("readx: fd=%d wanted=%zu got=%zu", fd, len0, len0 - len);
if (ADB_TRACING) {
dump_hex(reinterpret_cast<const unsigned char*>(buf), len0);
}
VLOG(RWX) << "readx: fd=" << fd << " wanted=" << len0 << " got=" << (len0 - len)
<< " " << dump_hex(reinterpret_cast<const unsigned char*>(buf), len0);
return true;
}
@ -96,10 +94,8 @@ bool WriteFdExactly(int fd, const void* buf, size_t len) {
const char* p = reinterpret_cast<const char*>(buf);
int r;
D("writex: fd=%d len=%d: ", fd, (int)len);
if (ADB_TRACING) {
dump_hex(reinterpret_cast<const unsigned char*>(buf), len);
}
VLOG(RWX) << "writex: fd=" << fd << " len=" << len
<< " " << dump_hex(reinterpret_cast<const unsigned char*>(buf), len);
while (len > 0) {
r = adb_write(fd, p, len);

174
adb/adb_trace.cpp Normal file
View File

@ -0,0 +1,174 @@
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "sysdeps.h"
#include "adb_trace.h"
#include <string>
#include <unordered_map>
#include <vector>
#include <base/logging.h>
#include <base/strings.h>
#include "adb.h"
#if !ADB_HOST
#include <cutils/properties.h>
#endif
#if !ADB_HOST
const char* adb_device_banner = "device";
static android::base::LogdLogger gLogdLogger;
#else
const char* adb_device_banner = "host";
#endif
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
}
#if !ADB_HOST
static std::string get_log_file_name() {
struct tm now;
time_t t;
tzset();
time(&t);
localtime_r(&t, &now);
char timestamp[PATH_MAX];
strftime(timestamp, sizeof(timestamp), "%Y-%m-%d-%H-%M-%S", &now);
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.
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
fprintf(stderr, "--- adb starting (pid %d) ---\n", getpid());
unix_close(fd);
}
#endif
int adb_trace_mask;
std::string get_trace_setting_from_env() {
const char* setting = getenv("ADB_TRACE");
if (setting == nullptr) {
setting = "";
}
return std::string(setting);
}
#if !ADB_HOST
std::string get_trace_setting_from_prop() {
char buf[PROPERTY_VALUE_MAX];
property_get("persist.adb.trace_mask", buf, "");
return std::string(buf);
}
#endif
std::string get_trace_setting() {
#if ADB_HOST
return get_trace_setting_from_env();
#else
return get_trace_setting_from_prop();
#endif
}
// Split the space separated list of tags from the trace setting and build the
// trace mask from it. note that '1' and 'all' are special cases to enable all
// tracing.
//
// adb's trace setting comes from the ADB_TRACE environment variable, whereas
// adbd's comes from the system property persist.adb.trace_mask.
static void setup_trace_mask() {
const std::string trace_setting = get_trace_setting();
if (trace_setting.empty()) {
return;
}
std::unordered_map<std::string, int> trace_flags = {
{"1", 0},
{"all", 0},
{"adb", ADB},
{"sockets", SOCKETS},
{"packets", PACKETS},
{"rwx", RWX},
{"usb", USB},
{"sync", SYNC},
{"sysdeps", SYSDEPS},
{"transport", TRANSPORT},
{"jdwp", JDWP},
{"services", SERVICES},
{"auth", AUTH},
{"fdevent", FDEVENT},
{"shell", SHELL}};
std::vector<std::string> elements = android::base::Split(trace_setting, " ");
for (const auto& elem : elements) {
const auto& flag = trace_flags.find(elem);
if (flag == trace_flags.end()) {
LOG(ERROR) << "Unknown trace flag: " << elem;
continue;
}
if (flag->second == 0) {
// 0 is used for the special values "1" and "all" that enable all
// tracing.
adb_trace_mask = ~0;
return;
} else {
adb_trace_mask |= 1 << flag->second;
}
}
}
void adb_trace_init(char** argv) {
#if !ADB_HOST
// Don't open log file if no tracing, since this will block
// the crypto unmount of /data
if (!get_trace_setting().empty()) {
if (isatty(STDOUT_FILENO) == 0) {
start_device_log();
}
}
#endif
android::base::InitLogging(argv, AdbLogger);
setup_trace_mask();
VLOG(ADB) << adb_version();
}
void adb_trace_enable(AdbTrace trace_tag) {
adb_trace_mask |= (1 << trace_tag);
}

View File

@ -22,36 +22,40 @@
/* IMPORTANT: if you change the following list, don't
* forget to update the corresponding 'tags' table in
* the adb_trace_init() function implemented in adb.c
* the adb_trace_init() function implemented in adb_trace.cpp.
*/
enum AdbTrace {
TRACE_ADB = 0, /* 0x001 */
TRACE_SOCKETS,
TRACE_PACKETS,
TRACE_TRANSPORT,
TRACE_RWX, /* 0x010 */
TRACE_USB,
TRACE_SYNC,
TRACE_SYSDEPS,
TRACE_JDWP, /* 0x100 */
TRACE_SERVICES,
TRACE_AUTH,
TRACE_FDEVENT,
TRACE_SHELL
ADB = 0, /* 0x001 */
SOCKETS,
PACKETS,
TRANSPORT,
RWX, /* 0x010 */
USB,
SYNC,
SYSDEPS,
JDWP, /* 0x100 */
SERVICES,
AUTH,
FDEVENT,
SHELL
};
extern int adb_trace_mask;
extern unsigned char adb_trace_output_count;
void adb_trace_init(char**);
#define VLOG_IS_ON(TAG) \
((adb_trace_mask & (1 << TAG)) != 0)
#define ADB_TRACING ((adb_trace_mask & (1 << TRACE_TAG)) != 0)
#define VLOG(TAG) \
if (LIKELY(!VLOG_IS_ON(TAG))) \
; \
else \
LOG(INFO)
// You must define TRACE_TAG before using this macro.
#define D(...) \
do { \
if (ADB_TRACING) { \
LOG(INFO) << android::base::StringPrintf(__VA_ARGS__); \
} \
} while (0)
VLOG(TRACE_TAG) << android::base::StringPrintf(__VA_ARGS__)
extern int adb_trace_mask;
void adb_trace_init(char**);
void adb_trace_enable(AdbTrace trace_tag);
#endif /* __ADB_TRACE_H */

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_ADB
#define TRACE_TAG ADB
#include "adb_utils.h"
@ -151,7 +151,7 @@ bool mkdirs(const std::string& path) {
return true;
}
void dump_hex(const void* data, size_t byte_count) {
std::string dump_hex(const void* data, size_t byte_count) {
byte_count = std::min(byte_count, size_t(16));
const uint8_t* p = reinterpret_cast<const uint8_t*>(data);
@ -170,7 +170,7 @@ void dump_hex(const void* data, size_t byte_count) {
line.push_back(c);
}
D("%s", line.c_str());
return line;
}
bool parse_host_and_port(const std::string& address,

View File

@ -31,7 +31,7 @@ bool mkdirs(const std::string& path);
std::string escape_arg(const std::string& s);
void dump_hex(const void* ptr, size_t byte_count);
std::string dump_hex(const void* ptr, size_t byte_count);
// Parses 'address' into 'host' and 'port'.
// If no port is given, takes the default from *port.

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_ADB
#define TRACE_TAG ADB
#include "sysdeps.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_ADB
#define TRACE_TAG ADB
#include "sysdeps.h"
@ -1546,6 +1546,8 @@ int adb_commandline(int argc, const char **argv) {
}
else if (!strcmp(argv[0], "keygen")) {
if (argc < 2) return usage();
// Always print key generation information for keygen command.
adb_trace_enable(AUTH);
return adb_auth_keygen(argv[1]);
}
else if (!strcmp(argv[0], "jdwp")) {

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_ADB
#define TRACE_TAG ADB
#include "sysdeps.h"

View File

@ -15,7 +15,7 @@
** limitations under the License.
*/
#define TRACE_TAG TRACE_FDEVENT
#define TRACE_TAG FDEVENT
#include "sysdeps.h"
#include "fdevent.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_SYNC
#define TRACE_TAG SYNC
#include "sysdeps.h"
#include "file_sync_service.h"

View File

@ -16,7 +16,7 @@
/* implement the "debug-ports" and "track-debug-ports" device services */
#define TRACE_TAG TRACE_JDWP
#define TRACE_TAG JDWP
#include "sysdeps.h"
@ -324,8 +324,9 @@ jdwp_process_event( int socket, unsigned events, void* _proc )
}
CloseProcess:
if (proc->pid >= 0)
if (proc->pid >= 0) {
D( "remove pid %d to jdwp process list", proc->pid );
}
jdwp_process_free(proc);
return;
}

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_ADB
#define TRACE_TAG ADB
#include "sysdeps.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_SERVICES
#define TRACE_TAG SERVICES
#include "sysdeps.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_ADB
#define TRACE_TAG ADB
#include "sysdeps.h"

View File

@ -75,7 +75,7 @@
// to be more complex due to partial reads and non-blocking I/O so this model
// was chosen instead.
#define TRACE_TAG TRACE_SHELL
#define TRACE_TAG SHELL
#include "shell_service.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_SOCKETS
#define TRACE_TAG SOCKETS
#include "sysdeps.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_SYSDEPS
#define TRACE_TAG SYSDEPS
#include "sysdeps.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_TRANSPORT
#define TRACE_TAG TRANSPORT
#include "sysdeps.h"
#include "transport.h"
@ -42,7 +42,7 @@ static std::list<atransport*> pending_list;
ADB_MUTEX_DEFINE( transport_lock );
static void dump_packet(const char* name, const char* func, apacket* p) {
static std::string dump_packet(const char* name, const char* func, apacket* p) {
unsigned command = p->msg.command;
int len = p->msg.data_length;
char cmd[9];
@ -73,9 +73,10 @@ static void dump_packet(const char* name, const char* func, apacket* p) {
else
snprintf(arg1, sizeof arg1, "0x%x", p->msg.arg1);
D("%s: %s: [%s] arg0=%s arg1=%s (len=%d) ",
name, func, cmd, arg0, arg1, len);
dump_hex(p->data, len);
std::string result = android::base::StringPrintf("%s: %s: [%s] arg0=%s arg1=%s (len=%d) ",
name, func, cmd, arg0, arg1, len);
result += dump_hex(p->data, len);
return result;
}
static int
@ -99,9 +100,7 @@ read_packet(int fd, const char* name, apacket** ppacket)
}
}
if (ADB_TRACING) {
dump_packet(name, "from remote", *ppacket);
}
VLOG(TRANSPORT) << dump_packet(name, "from remote", *ppacket);
return 0;
}
@ -113,9 +112,7 @@ write_packet(int fd, const char* name, apacket** ppacket)
snprintf(buff, sizeof buff, "fd=%d", fd);
name = buff;
}
if (ADB_TRACING) {
dump_packet(name, "to remote", *ppacket);
}
VLOG(TRANSPORT) << dump_packet(name, "to remote", *ppacket);
char* p = reinterpret_cast<char*>(ppacket); /* we really write the packet address */
int len = sizeof(apacket*);
while(len > 0) {
@ -996,19 +993,16 @@ void unregister_usb_transport(usb_handle *usb) {
adb_mutex_unlock(&transport_lock);
}
#undef TRACE_TAG
#define TRACE_TAG TRACE_RWX
int check_header(apacket *p, atransport *t)
{
if(p->msg.magic != (p->msg.command ^ 0xffffffff)) {
D("check_header(): invalid magic");
VLOG(RWX) << "check_header(): invalid magic";
return -1;
}
if(p->msg.data_length > t->get_max_payload()) {
D("check_header(): %u > atransport::max_payload = %zu",
p->msg.data_length, t->get_max_payload());
VLOG(RWX) << "check_header(): " << p->msg.data_length << " atransport::max_payload = "
<< t->get_max_payload();
return -1;
}

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_TRANSPORT
#define TRACE_TAG TRANSPORT
#include "sysdeps.h"
#include "transport.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_TRANSPORT
#define TRACE_TAG TRANSPORT
#include "sysdeps.h"
#include "transport.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_USB
#define TRACE_TAG USB
#include "sysdeps.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_USB
#define TRACE_TAG USB
#include "sysdeps.h"
@ -491,12 +491,14 @@ static void usb_ffs_kick(usb_handle *h)
int err;
err = ioctl(h->bulk_in, FUNCTIONFS_CLEAR_HALT);
if (err < 0)
if (err < 0) {
D("[ kick: source (fd=%d) clear halt failed (%d) ]", h->bulk_in, errno);
}
err = ioctl(h->bulk_out, FUNCTIONFS_CLEAR_HALT);
if (err < 0)
if (err < 0) {
D("[ kick: sink (fd=%d) clear halt failed (%d) ]", h->bulk_out, errno);
}
adb_mutex_lock(&h->lock);

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_USB
#define TRACE_TAG USB
#include "sysdeps.h"

View File

@ -14,7 +14,7 @@
* limitations under the License.
*/
#define TRACE_TAG TRACE_USB
#define TRACE_TAG USB
#include "sysdeps.h"