0

ipc/tracing: Use typed trace events for IPC message sends

Replaces SyncChannel::Send, RenderProcessHostImpl::Send, and
GpuChannelHost::Send trace events with typed trace events. Also adds a
utility to convert the IPC class ID to a corresponding protobuf enum.

Corresponding proto buffer definitions for these events were added in
aosp/1180211.

Typed trace events will allow inclusion of the event arguments in slow
reports data in the future. The trace format is protocol-buffer based
under the hood already (see docs.perfetto.dev for details), this patch
adds strong typing for the arguments of the respective events only.

TBR: sunnyps@chromium.org
Bug: 644264
Change-Id: I91c71230e62161b08faec889bf9eb70639ae0b5e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1950986
Commit-Queue: Eric Seckler <eseckler@chromium.org>
Reviewed-by: Alex Moshchuk <alexmos@chromium.org>
Reviewed-by: Ken Rockot <rockot@google.com>
Cr-Commit-Position: refs/heads/master@{#730120}
This commit is contained in:
Eric Seckler
2020-01-10 10:51:28 +00:00
committed by Commit Bot
parent 29e499dc26
commit 502a8b4db8
7 changed files with 183 additions and 7 deletions

@ -193,6 +193,7 @@
#include "ipc/ipc_channel.h"
#include "ipc/ipc_channel_mojo.h"
#include "ipc/ipc_logging.h"
#include "ipc/trace_ipc_message.h"
#include "media/audio/audio_manager.h"
#include "media/base/media_switches.h"
#include "media/capture/capture_switches.h"
@ -3370,9 +3371,7 @@ bool RenderProcessHostImpl::FastShutdownIfPossible(size_t page_count,
}
bool RenderProcessHostImpl::Send(IPC::Message* msg) {
TRACE_EVENT2("renderer_host", "RenderProcessHostImpl::Send", "class",
IPC_MESSAGE_ID_CLASS(msg->type()), "line",
IPC_MESSAGE_ID_LINE(msg->type()));
TRACE_IPC_MESSAGE_SEND("renderer_host", "RenderProcessHostImpl::Send", msg);
std::unique_ptr<IPC::Message> message(msg);

@ -13,7 +13,6 @@
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_restrictions.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "gpu/ipc/common/command_buffer_id.h"
#include "gpu/ipc/common/gpu_messages.h"
@ -21,6 +20,7 @@
#include "gpu/ipc/common/gpu_watchdog_timeout.h"
#include "ipc/ipc_channel_mojo.h"
#include "ipc/ipc_sync_message.h"
#include "ipc/trace_ipc_message.h"
#include "mojo/public/cpp/bindings/lib/message_quota_checker.h"
#include "url/gurl.h"
@ -53,9 +53,7 @@ GpuChannelHost::GpuChannelHost(int channel_id,
}
bool GpuChannelHost::Send(IPC::Message* msg) {
TRACE_EVENT2("ipc", "GpuChannelHost::Send", "class",
IPC_MESSAGE_ID_CLASS(msg->type()), "line",
IPC_MESSAGE_ID_LINE(msg->type()));
TRACE_IPC_MESSAGE_SEND("ipc", "GpuChannelHost::Send", msg);
auto message = base::WrapUnique(msg);

@ -107,6 +107,14 @@ component("ipc") {
if (enable_ipc_fuzzer) {
public_configs = [ "//tools/ipc_fuzzer:ipc_fuzzer_config" ]
}
if (!is_nacl && !is_ios) {
sources += [
"trace_ipc_message.cc",
"trace_ipc_message.h",
]
public_deps += [ "//services/tracing/public/cpp" ]
}
}
component("message_support") {

@ -4,6 +4,8 @@ include_rules = [
# For ipc_channel_nacl.cc:
"+native_client/src/public",
"+sandbox/mac/seatbelt.h",
"+services/tracing/public/cpp",
"+third_party/perfetto/protos/perfetto/trace/track_event",
]
specific_include_rules = {

@ -21,12 +21,17 @@
#include "base/threading/thread_local.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "ipc/ipc_channel_factory.h"
#include "ipc/ipc_logging.h"
#include "ipc/ipc_message_macros.h"
#include "ipc/ipc_sync_message.h"
#include "mojo/public/cpp/bindings/sync_event_watcher.h"
#if !defined(OS_NACL) && !BUILDFLAG(IPC_MESSAGE_LOG_ENABLED)
#include "ipc/trace_ipc_message.h"
#endif
using base::WaitableEvent;
namespace IPC {
@ -609,6 +614,8 @@ bool SyncChannel::Send(Message* message) {
Logging::GetInstance()->GetMessageText(
message->type(), &name, message, nullptr);
TRACE_EVENT1("ipc", "SyncChannel::Send", "name", name);
#elif !defined(OS_NACL)
TRACE_IPC_MESSAGE_SEND("ipc", "SyncChannel::Send", message);
#else
TRACE_EVENT2("ipc", "SyncChannel::Send",
"class", IPC_MESSAGE_ID_CLASS(message->type()),

129
ipc/trace_ipc_message.cc Normal file

@ -0,0 +1,129 @@
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ipc/trace_ipc_message.h"
#include <stdint.h>
#include "ipc/ipc_message_macros.h"
#include "ipc/ipc_message_start.h"
#include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_legacy_ipc.pbzero.h"
namespace IPC {
using perfetto::protos::pbzero::ChromeLegacyIpc;
void WriteIpcMessageIdAsProtozero(uint32_t message_id,
ChromeLegacyIpc* legacy_ipc) {
ChromeLegacyIpc::MessageClass message_class =
ChromeLegacyIpc::CLASS_UNSPECIFIED;
switch (IPC_MESSAGE_ID_CLASS(message_id)) {
case AutomationMsgStart:
message_class = ChromeLegacyIpc::CLASS_AUTOMATION;
break;
case FrameMsgStart:
message_class = ChromeLegacyIpc::CLASS_FRAME;
break;
case PageMsgStart:
message_class = ChromeLegacyIpc::CLASS_PAGE;
break;
case ViewMsgStart:
message_class = ChromeLegacyIpc::CLASS_VIEW;
break;
case WidgetMsgStart:
message_class = ChromeLegacyIpc::CLASS_WIDGET;
break;
case InputMsgStart:
message_class = ChromeLegacyIpc::CLASS_INPUT;
break;
case TestMsgStart:
message_class = ChromeLegacyIpc::CLASS_TEST;
break;
case WorkerMsgStart:
message_class = ChromeLegacyIpc::CLASS_WORKER;
break;
case NaClMsgStart:
message_class = ChromeLegacyIpc::CLASS_NACL;
break;
case GpuChannelMsgStart:
message_class = ChromeLegacyIpc::CLASS_GPU_CHANNEL;
break;
case MediaMsgStart:
message_class = ChromeLegacyIpc::CLASS_MEDIA;
break;
case PpapiMsgStart:
message_class = ChromeLegacyIpc::CLASS_PPAPI;
break;
case ChromeMsgStart:
message_class = ChromeLegacyIpc::CLASS_CHROME;
break;
case DragMsgStart:
message_class = ChromeLegacyIpc::CLASS_DRAG;
break;
case PrintMsgStart:
message_class = ChromeLegacyIpc::CLASS_PRINT;
break;
case ExtensionMsgStart:
message_class = ChromeLegacyIpc::CLASS_EXTENSION;
break;
case TextInputClientMsgStart:
message_class = ChromeLegacyIpc::CLASS_TEXT_INPUT_CLIENT;
break;
case BlinkTestMsgStart:
message_class = ChromeLegacyIpc::CLASS_BLINK_TEST;
break;
case AccessibilityMsgStart:
message_class = ChromeLegacyIpc::CLASS_ACCESSIBILITY;
break;
case PrerenderMsgStart:
message_class = ChromeLegacyIpc::CLASS_PRERENDER;
break;
case ChromotingMsgStart:
message_class = ChromeLegacyIpc::CLASS_CHROMOTING;
break;
case AndroidWebViewMsgStart:
message_class = ChromeLegacyIpc::CLASS_ANDROID_WEB_VIEW;
break;
case NaClHostMsgStart:
message_class = ChromeLegacyIpc::CLASS_NACL_HOST;
break;
case EncryptedMediaMsgStart:
message_class = ChromeLegacyIpc::CLASS_ENCRYPTED_MEDIA;
break;
case CastMsgStart:
message_class = ChromeLegacyIpc::CLASS_CAST;
break;
case GinJavaBridgeMsgStart:
message_class = ChromeLegacyIpc::CLASS_GIN_JAVA_BRIDGE;
break;
case ChromeUtilityPrintingMsgStart:
message_class = ChromeLegacyIpc::CLASS_CHROME_UTILITY_PRINTING;
break;
case OzoneGpuMsgStart:
message_class = ChromeLegacyIpc::CLASS_OZONE_GPU;
break;
case WebTestMsgStart:
message_class = ChromeLegacyIpc::CLASS_WEB_TEST;
break;
case ExtensionsGuestViewMsgStart:
message_class = ChromeLegacyIpc::CLASS_EXTENSIONS_GUEST_VIEW;
break;
case GuestViewMsgStart:
message_class = ChromeLegacyIpc::CLASS_GUEST_VIEW;
break;
case MediaPlayerDelegateMsgStart:
message_class = ChromeLegacyIpc::CLASS_MEDIA_PLAYER_DELEGATE;
break;
case ExtensionWorkerMsgStart:
message_class = ChromeLegacyIpc::CLASS_EXTENSION_WORKER;
break;
case UnfreezableFrameMsgStart:
message_class = ChromeLegacyIpc::CLASS_UNFREEZABLE_FRAME;
break;
}
legacy_ipc->set_message_class(message_class);
legacy_ipc->set_message_line(IPC_MESSAGE_ID_LINE(message_id));
}
} // namespace IPC

33
ipc/trace_ipc_message.h Normal file

@ -0,0 +1,33 @@
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IPC_TRACE_IPC_MESSAGE_H_
#define IPC_TRACE_IPC_MESSAGE_H_
#include <stdint.h>
#include "base/component_export.h"
#include "services/tracing/public/cpp/perfetto/macros.h"
#include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_legacy_ipc.pbzero.h"
// When tracing is enabled, emits a trace event with the given category and
// event name and typed arguments for the message's type (message class and line
// number).
#define TRACE_IPC_MESSAGE_SEND(category, name, msg) \
TRACE_EVENT(category, name, [msg](perfetto::EventContext ctx) { \
IPC::WriteIpcMessageIdAsProtozero(msg->type(), \
ctx.event()->set_chrome_legacy_ipc()); \
});
namespace IPC {
// Converts |message_id| into its message class and line number parts and writes
// them to the protozero message |ChromeLegacyIpc| for trace events.
void COMPONENT_EXPORT(IPC)
WriteIpcMessageIdAsProtozero(uint32_t message_id,
perfetto::protos::pbzero::ChromeLegacyIpc*);
} // namespace IPC
#endif // IPC_TRACE_IPC_MESSAGE_H_