#include "content/browser/tracing/tracing_controller_impl.h"
#include <inttypes.h>
#include <memory>
#include <optional>
#include <string_view>
#include <utility>
#include <vector>
#include "base/command_line.h"
#include "base/containers/span.h"
#include "base/cpu.h"
#include "base/dcheck_is_on.h"
#include "base/files/file_tracing.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/i18n/time_formatting.h"
#include "base/logging.h"
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/strings/utf_string_conversions.h"
#include "base/system/sys_info.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "base/trace_event/trace_config.h"
#include "base/tracing/protos/grit/tracing_proto_resources.h"
#include "base/values.h"
#include "base/version_info/version_info.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "components/tracing/common/trace_to_console.h"
#include "components/tracing/common/tracing_switches.h"
#include "components/variations/active_field_trials.h"
#include "content/browser/gpu/compositor_util.h"
#include "content/browser/gpu/gpu_data_manager_impl.h"
#include "content/browser/tracing/file_tracing_provider_impl.h"
#include "content/browser/tracing/tracing_ui.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/tracing_controller.h"
#include "content/public/browser/tracing_service.h"
#include "content/public/common/content_client.h"
#include "gpu/config/gpu_info.h"
#include "mojo/public/cpp/system/data_pipe.h"
#include "net/base/network_change_notifier.h"
#include "services/tracing/public/cpp/perfetto/perfetto_config.h"
#include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h"
#include "services/tracing/public/cpp/perfetto/trace_event_data_source.h"
#include "services/tracing/public/cpp/trace_event_agent.h"
#include "services/tracing/public/cpp/traced_process_impl.h"
#include "services/tracing/public/cpp/tracing_features.h"
#include "services/tracing/public/mojom/constants.mojom.h"
#include "third_party/icu/source/i18n/unicode/timezone.h"
#include "third_party/perfetto/include/perfetto/protozero/message.h"
#include "third_party/perfetto/protos/perfetto/trace/extension_descriptor.pbzero.h"
#include "third_party/perfetto/protos/perfetto/trace/trace_packet.pbzero.h"
#include "v8/include/v8-version-string.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chromeos/ash/components/system/statistics_provider.h"
#include "content/browser/tracing/cros_tracing_agent.h"
#endif
#if defined(CAST_TRACING_AGENT)
#include "content/browser/tracing/cast_tracing_agent.h"
#endif
#if BUILDFLAG(IS_WIN)
#include <windows.h>
#include "base/power_monitor/cpu_frequency_utils.h"
#include "base/win/registry.h"
#include "base/win/win_util.h"
#include "base/win/windows_version.h"
#endif
#if BUILDFLAG(IS_ANDROID)
#include <sys/time.h>
#include "base/debug/elf_reader.h"
#include "content/browser/android/tracing_controller_android.h"
#include "services/tracing/public/cpp/perfetto/java_heap_profiler/java_heap_profiler_android.h"
extern char __ehdr_start;
#endif
namespace content {
namespace {
TracingControllerImpl* g_tracing_controller = …;
std::string GetNetworkTypeString() { … }
std::string GetClockString() { … }
#if BUILDFLAG(IS_ANDROID)
int64_t ConvertTimespecToMicros(const struct timespec& ts) {
if (sizeof(ts.tv_sec) <= 4 && sizeof(ts.tv_nsec) <= 8) {
int64_t result = ts.tv_sec;
result *= base::Time::kMicrosecondsPerSecond;
result += (ts.tv_nsec / base::Time::kNanosecondsPerMicrosecond);
return result;
}
base::CheckedNumeric<int64_t> result(ts.tv_sec);
result *= base::Time::kMicrosecondsPerSecond;
result += (ts.tv_nsec / base::Time::kNanosecondsPerMicrosecond);
return result.ValueOrDie();
}
std::string GetClockOffsetSinceEpoch() {
struct timespec realtime_before, monotonic, realtime_after;
clock_gettime(CLOCK_REALTIME, &realtime_before);
clock_gettime(CLOCK_MONOTONIC, &monotonic);
clock_gettime(CLOCK_REALTIME, &realtime_after);
return base::NumberToString(ConvertTimespecToMicros(realtime_before) / 2 +
ConvertTimespecToMicros(realtime_after) / 2 -
ConvertTimespecToMicros(monotonic));
}
#endif
bool IsSpecialCategory(const std::string& name) { … }
}
TracingController* TracingController::GetInstance() { … }
TracingControllerImpl::TracingControllerImpl() { … }
TracingControllerImpl::~TracingControllerImpl() = default;
void TracingControllerImpl::AddAgents() { … }
void TracingControllerImpl::GenerateMetadataPacketFieldTrials(
perfetto::protos::pbzero::ChromeMetadataPacket* metadata_proto,
bool privacy_filtering_enabled) { … }
void TracingControllerImpl::ConnectToServiceIfNeeded() { … }
void TracingControllerImpl::GenerateMetadataPacket(
perfetto::protos::pbzero::TracePacket* handle,
bool privacy_filtering_enabled) { … }
std::optional<base::Value::Dict> TracingControllerImpl::GenerateMetadataDict() { … }
TracingControllerImpl* TracingControllerImpl::GetInstance() { … }
bool TracingControllerImpl::GetCategories(GetCategoriesDoneCallback callback) { … }
bool TracingControllerImpl::StartTracing(
const base::trace_event::TraceConfig& trace_config,
StartTracingDoneCallback callback) { … }
bool TracingControllerImpl::StopTracing(
const scoped_refptr<TraceDataEndpoint>& trace_data_endpoint) { … }
bool TracingControllerImpl::StopTracing(
const scoped_refptr<TraceDataEndpoint>& trace_data_endpoint,
const std::string& agent_label,
bool privacy_filtering_enabled) { … }
bool TracingControllerImpl::GetTraceBufferUsage(
GetTraceBufferUsageCallback callback) { … }
bool TracingControllerImpl::IsTracing() { … }
void TracingControllerImpl::OnTracingEnabled() { … }
void TracingControllerImpl::OnTracingDisabled(bool) { … }
void TracingControllerImpl::OnTracingFailed() { … }
void TracingControllerImpl::OnDataAvailable(base::span<const uint8_t> data) { … }
void TracingControllerImpl::CompleteFlush() { … }
void TracingControllerImpl::OnDataComplete() { … }
void TracingControllerImpl::OnReadBuffersComplete() { … }
#if BUILDFLAG(IS_CHROMEOS_ASH)
void TracingControllerImpl::OnMachineStatisticsLoaded() {
if (const std::optional<std::string_view> hardware_class =
ash::system::StatisticsProvider::GetInstance()->GetMachineStatistic(
ash::system::kHardwareClassKey)) {
hardware_class_ = std::string(hardware_class.value());
}
are_statistics_loaded_ = true;
}
#endif
}