From 0078195f0a0ca601ad4d5d5d5090ffc5128d1396 Mon Sep 17 00:00:00 2001 From: "wangxianzhu@chromium.org" Date: Fri, 10 May 2013 20:31:25 +0000 Subject: Handle convertable_values on Android r198113 added |convertable_values|. Needs to be handled on Android otherwise Chrome will crash because of NULL |values|. BUG=239721 TBR=dsinclair@chromium.org, joth@chromium.org Review URL: https://codereview.chromium.org/14655018 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@199529 0039d316-1c4b-4281-b951-d872f2087c98 --- base/debug/trace_event_android.cc | 59 +++++++++++++++++++++++---------------- base/debug/trace_event_impl.cc | 3 +- base/debug/trace_event_impl.h | 1 + 3 files changed, 38 insertions(+), 25 deletions(-) (limited to 'base') diff --git a/base/debug/trace_event_android.cc b/base/debug/trace_event_android.cc index 8cc5f3c..23e022d 100644 --- a/base/debug/trace_event_android.cc +++ b/base/debug/trace_event_android.cc @@ -16,15 +16,17 @@ namespace { int g_atrace_fd = -1; const char* kATraceMarkerFile = "/sys/kernel/debug/tracing/trace_marker"; -void WriteEvent(char phase, - const char* category_group, - const char* name, - unsigned long long id, - int num_args, - const char** arg_names, - const unsigned char* arg_types, - const unsigned long long* arg_values, - unsigned char flags) { +void WriteEvent( + char phase, + const char* category_group, + const char* name, + unsigned long long id, + int num_args, + const char** arg_names, + const unsigned char* arg_types, + const unsigned long long* arg_values, + scoped_ptr convertable_values[], + unsigned char flags) { std::string out = base::StringPrintf("%c|%d|%s", phase, getpid(), name); if (flags & TRACE_EVENT_FLAG_HAS_ID) base::StringAppendF(&out, "-%" PRIx64, static_cast(id)); @@ -35,10 +37,14 @@ void WriteEvent(char phase, out += ';'; out += arg_names[i]; out += '='; - base::debug::TraceEvent::TraceValue value; - value.as_uint = arg_values[i]; std::string::size_type value_start = out.length(); - base::debug::TraceEvent::AppendValueAsJSON(arg_types[i], value, &out); + if (arg_types[i] == TRACE_VALUE_TYPE_CONVERTABLE) { + convertable_values[i]->AppendAsTraceFormat(&out); + } else { + base::debug::TraceEvent::TraceValue value; + value.as_uint = arg_values[i]; + base::debug::TraceEvent::AppendValueAsJSON(arg_types[i], value, &out); + } // Remove the quotes which may confuse the atrace script. ReplaceSubstringsAfterOffset(&out, value_start, "\\\"", "'"); ReplaceSubstringsAfterOffset(&out, value_start, "\"", ""); @@ -74,35 +80,40 @@ void TraceLog::StopATrace() { } } -void TraceLog::SendToATrace(char phase, - const char* category_group, - const char* name, - unsigned long long id, - int num_args, - const char** arg_names, - const unsigned char* arg_types, - const unsigned long long* arg_values, - unsigned char flags) { +void TraceLog::SendToATrace( + char phase, + const char* category_group, + const char* name, + unsigned long long id, + int num_args, + const char** arg_names, + const unsigned char* arg_types, + const unsigned long long* arg_values, + scoped_ptr convertable_values[], + unsigned char flags) { if (g_atrace_fd == -1) return; switch (phase) { case TRACE_EVENT_PHASE_BEGIN: WriteEvent('B', category_group, name, id, - num_args, arg_names, arg_types, arg_values, flags); + num_args, arg_names, arg_types, arg_values, convertable_values, + flags); break; case TRACE_EVENT_PHASE_END: // Though a single 'E' is enough, here append pid, name and // category_group etc. So that unpaired events can be found easily. WriteEvent('E', category_group, name, id, - num_args, arg_names, arg_types, arg_values, flags); + num_args, arg_names, arg_types, arg_values, convertable_values, + flags); break; case TRACE_EVENT_PHASE_INSTANT: // Simulate an instance event with a pair of begin/end events. WriteEvent('B', category_group, name, id, - num_args, arg_names, arg_types, arg_values, flags); + num_args, arg_names, arg_types, arg_values, convertable_values, + flags); write(g_atrace_fd, "E", 1); break; diff --git a/base/debug/trace_event_impl.cc b/base/debug/trace_event_impl.cc index 3b1ac1e..7ce4119 100644 --- a/base/debug/trace_event_impl.cc +++ b/base/debug/trace_event_impl.cc @@ -1094,7 +1094,8 @@ void TraceLog::AddTraceEventWithThreadIdAndTimestamp( #if defined(OS_ANDROID) SendToATrace(phase, GetCategoryGroupName(category_group_enabled), name, id, - num_args, arg_names, arg_types, arg_values, flags); + num_args, arg_names, arg_types, arg_values, convertable_values, + flags); #endif TimeTicks now = timestamp - time_offset_; diff --git a/base/debug/trace_event_impl.h b/base/debug/trace_event_impl.h index 28bf1a0..9ffcef5 100644 --- a/base/debug/trace_event_impl.h +++ b/base/debug/trace_event_impl.h @@ -510,6 +510,7 @@ class BASE_EXPORT TraceLog { const char** arg_names, const unsigned char* arg_types, const unsigned long long* arg_values, + scoped_ptr convertable_values[], unsigned char flags); static void ApplyATraceEnabledFlag(unsigned char* category_group_enabled); #endif -- cgit v1.1