Merge "tp: move completition of dangling sched events from C++ to SQL"
diff --git a/infra/perfetto.dev/src/assets/style.scss b/infra/perfetto.dev/src/assets/style.scss
index e141890..0d0bbbe 100644
--- a/infra/perfetto.dev/src/assets/style.scss
+++ b/infra/perfetto.dev/src/assets/style.scss
@@ -683,6 +683,9 @@
             tr {
                 height: 20px;
             }
+            tr:target {
+                background-color: #ecba2a;
+            }
             thead {
                 text-align: left;
                 background-color: #e8eaed;
diff --git a/infra/perfetto.dev/src/gen_stats_reference.js b/infra/perfetto.dev/src/gen_stats_reference.js
index 0f7228e..0658d01 100644
--- a/infra/perfetto.dev/src/gen_stats_reference.js
+++ b/infra/perfetto.dev/src/gen_stats_reference.js
@@ -66,13 +66,14 @@
 
 function tableToMarkdown(table) {
   let md = `# Trace Processor Stats\n\n`;
-  md += 'Name | Cardinality | Type | Scope | Description |\n';
-  md += '---- | ----------- | ---- | ----- | ----------- |\n';
+  md += `<table><thead><tr><td>Name</td><td>Cardinality</td><td>Type</td>
+  <td>Scope</td><td>Description</td></tr></thead>\n`;
   for (const col of table) {
-    md += `${col.name} | ${col.cardinality} | ${col.type} | ${col.scope} | ${
-        singleLineComment(col.comment)} |\n`
+    md += `<tr id="${col.name}"><td>${col.name}</td>
+    <td>${col.cardinality}</td><td>${col.type}</td><td>${col.scope}</td>
+    <td>${singleLineComment(col.comment)} </td></tr>\n`
   }
-  md += '\n\n';
+  md += '</table>\n\n';
   return md;
 }
 
diff --git a/src/profiling/memory/heapprofd_end_to_end_test.cc b/src/profiling/memory/heapprofd_end_to_end_test.cc
index 590cdd2..ec024a1 100644
--- a/src/profiling/memory/heapprofd_end_to_end_test.cc
+++ b/src/profiling/memory/heapprofd_end_to_end_test.cc
@@ -59,6 +59,29 @@
 
 constexpr const char* kHeapprofdModeProperty = "heapprofd.userdebug.mode";
 
+void ContinuousDump(HeapprofdConfig* cfg) {
+  auto* cont_config = cfg->mutable_continuous_dump_config();
+  cont_config->set_dump_phase_ms(0);
+  cont_config->set_dump_interval_ms(100);
+}
+
+template <typename F>
+TraceConfig MakeTraceConfig(F fn) {
+  TraceConfig trace_config;
+  trace_config.add_buffers()->set_size_kb(10 * 1024);
+  trace_config.set_duration_ms(2000);
+  trace_config.set_data_source_stop_timeout_ms(10000);
+
+  auto* ds_config = trace_config.add_data_sources()->mutable_config();
+  ds_config->set_name("android.heapprofd");
+  ds_config->set_target_buffer(0);
+
+  protos::gen::HeapprofdConfig heapprofd_config;
+  fn(&heapprofd_config);
+  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
+  return trace_config;
+}
+
 #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
 
 std::string ReadProperty(const std::string& name, std::string def) {
@@ -359,24 +382,12 @@
   base::Subprocess child = ForkContinuousMalloc(kAllocSize);
   const auto pid = child.pid();
 
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(2000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-  ds_config->set_target_buffer(0);
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid));
-  heapprofd_config.set_all(false);
-  heapprofd_config.add_heaps("invalid");
-  auto* cont_config = heapprofd_config.mutable_continuous_dump_config();
-  cont_config->set_dump_phase_ms(0);
-  cont_config->set_dump_interval_ms(100);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
+  TraceConfig trace_config = MakeTraceConfig([pid](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+    cfg->add_heaps("invalid");
+    ContinuousDump(cfg);
+  });
 
   auto helper = Trace(trace_config);
   PrintStats(helper.get());
@@ -390,23 +401,11 @@
   base::Subprocess child = ForkContinuousMalloc(kAllocSize);
   const auto pid = child.pid();
 
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(2000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-  ds_config->set_target_buffer(0);
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid));
-  heapprofd_config.set_all(false);
-  auto* cont_config = heapprofd_config.mutable_continuous_dump_config();
-  cont_config->set_dump_phase_ms(0);
-  cont_config->set_dump_interval_ms(100);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
+  TraceConfig trace_config = MakeTraceConfig([pid](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+    ContinuousDump(cfg);
+  });
 
   auto helper = Trace(trace_config);
   PrintStats(helper.get());
@@ -424,25 +423,13 @@
   base::Subprocess child = ForkContinuousMalloc(kAllocSize, kCustomAllocSize);
   const auto pid = child.pid();
 
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(2000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-  ds_config->set_target_buffer(0);
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid));
-  heapprofd_config.set_all(false);
-  heapprofd_config.add_heaps("test");
-  heapprofd_config.add_heaps("malloc");
-  auto* cont_config = heapprofd_config.mutable_continuous_dump_config();
-  cont_config->set_dump_phase_ms(0);
-  cont_config->set_dump_interval_ms(100);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
+  TraceConfig trace_config = MakeTraceConfig([pid](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+    cfg->add_heaps("test");
+    cfg->add_heaps("malloc");
+    ContinuousDump(cfg);
+  });
 
   auto helper = Trace(trace_config);
   PrintStats(helper.get());
@@ -487,21 +474,11 @@
   child.Start();
   const auto pid = child.pid();
 
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(2000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-  ds_config->set_target_buffer(0);
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid));
-  heapprofd_config.set_all(false);
-  heapprofd_config.add_heaps("test");
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
+  TraceConfig trace_config = MakeTraceConfig([pid](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+    cfg->add_heaps("test");
+  });
 
   auto helper = Trace(trace_config);
   PrintStats(helper.get());
@@ -528,24 +505,12 @@
   base::Subprocess child = ForkContinuousMalloc(0, kAllocSize);
   const auto pid = child.pid();
 
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(2000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-  ds_config->set_target_buffer(0);
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid));
-  heapprofd_config.set_all(false);
-  heapprofd_config.add_heaps("test");
-  auto* cont_config = heapprofd_config.mutable_continuous_dump_config();
-  cont_config->set_dump_phase_ms(0);
-  cont_config->set_dump_interval_ms(100);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
+  TraceConfig trace_config = MakeTraceConfig([pid](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+    cfg->add_heaps("test");
+    ContinuousDump(cfg);
+  });
 
   auto helper = Trace(trace_config);
   PrintStats(helper.get());
@@ -561,24 +526,11 @@
 
   base::Subprocess child = ForkContinuousMalloc(0, kAllocSize);
   const auto pid = child.pid();
-
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(2000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-  ds_config->set_target_buffer(0);
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid));
-  heapprofd_config.set_all(false);
-  auto* cont_config = heapprofd_config.mutable_continuous_dump_config();
-  cont_config->set_dump_phase_ms(0);
-  cont_config->set_dump_interval_ms(100);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
+  TraceConfig trace_config = MakeTraceConfig([pid](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+    ContinuousDump(cfg);
+  });
 
   auto helper = Trace(trace_config);
   PrintStats(helper.get());
@@ -596,21 +548,11 @@
   const auto pid = child.pid();
   const auto pid2 = child2.pid();
 
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(2000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-  ds_config->set_target_buffer(0);
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid));
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid2));
-  heapprofd_config.set_all(false);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
+  TraceConfig trace_config = MakeTraceConfig([pid, pid2](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+    cfg->add_pid(static_cast<uint64_t>(pid2));
+  });
 
   auto helper = Trace(trace_config);
   PrintStats(helper.get());
@@ -628,21 +570,10 @@
 
   base::Subprocess child = ForkContinuousMalloc(kAllocSize);
   const auto pid = child.pid();
-
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(2000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-  ds_config->set_target_buffer(0);
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid));
-  heapprofd_config.set_all(false);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
+  TraceConfig trace_config = MakeTraceConfig([pid](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+  });
 
   auto helper = Trace(trace_config);
   PrintStats(helper.get());
@@ -656,19 +587,12 @@
 TEST_P(HeapprofdEndToEnd, NativeStartup) {
   auto helper = GetHelper(&task_runner);
 
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
+  TraceConfig trace_config = MakeTraceConfig([](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_process_cmdline("heapprofd_continuous_malloc");
+    cfg->set_all(false);
+  });
   trace_config.set_duration_ms(5000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_process_cmdline("heapprofd_continuous_malloc");
-  heapprofd_config.set_all(false);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
 
   helper->StartTracing(trace_config);
 
@@ -723,19 +647,12 @@
 TEST_P(HeapprofdEndToEnd, NativeStartupDenormalizedCmdline) {
   auto helper = GetHelper(&task_runner);
 
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
+  TraceConfig trace_config = MakeTraceConfig([](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_process_cmdline("heapprofd_continuous_malloc@1.2.3");
+    cfg->set_all(false);
+  });
   trace_config.set_duration_ms(5000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_process_cmdline("heapprofd_continuous_malloc@1.2.3");
-  heapprofd_config.set_all(false);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
 
   helper->StartTracing(trace_config);
 
@@ -790,20 +707,6 @@
 TEST_P(HeapprofdEndToEnd, DiscoverByName) {
   auto helper = GetHelper(&task_runner);
 
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(5000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_process_cmdline("heapprofd_continuous_malloc");
-  heapprofd_config.set_all(false);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
-
   base::Subprocess child({"/proc/self/exe"});
   child.args.argv0_override = "heapprofd_continuous_malloc";
   child.args.stdout_mode = base::Subprocess::kDevNull;
@@ -815,6 +718,13 @@
   // match it by the startup logic.
   sleep(1);
 
+  TraceConfig trace_config = MakeTraceConfig([](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_process_cmdline("heapprofd_continuous_malloc");
+    cfg->set_all(false);
+  });
+  trace_config.set_duration_ms(5000);
+
   helper->StartTracing(trace_config);
   helper->WaitForTracingDisabled(kTracingDisabledTimeoutMs);
 
@@ -853,20 +763,6 @@
 TEST_P(HeapprofdEndToEnd, DiscoverByNameDenormalizedCmdline) {
   auto helper = GetHelper(&task_runner);
 
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(5000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_process_cmdline("heapprofd_continuous_malloc@1.2.3");
-  heapprofd_config.set_all(false);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
-
   // Make sure the forked process does not get reparented to init.
   base::Subprocess child({"/proc/self/exe"});
   child.args.argv0_override = "heapprofd_continuous_malloc";
@@ -879,6 +775,13 @@
   // match it by the startup logic.
   sleep(1);
 
+  TraceConfig trace_config = MakeTraceConfig([](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_process_cmdline("heapprofd_continuous_malloc@1.2.3");
+    cfg->set_all(false);
+  });
+  trace_config.set_duration_ms(5000);
+
   helper->StartTracing(trace_config);
   helper->WaitForTracingDisabled(kTracingDisabledTimeoutMs);
 
@@ -954,20 +857,10 @@
   signal_pipe.rd.reset();
   ack_pipe.wr.reset();
 
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(2000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-  ds_config->set_target_buffer(0);
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid));
-  heapprofd_config.set_all(false);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
+  TraceConfig trace_config = MakeTraceConfig([pid](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+  });
 
   auto helper = Trace(trace_config);
   PrintStats(helper.get());
@@ -1036,22 +929,11 @@
 
   signal_pipe.rd.reset();
   ack_pipe.wr.reset();
-
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(2000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-  ds_config->set_target_buffer(0);
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid));
-  heapprofd_config.set_all(false);
-  heapprofd_config.add_heaps("invalid");
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
+  TraceConfig trace_config = MakeTraceConfig([pid](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+    cfg->add_heaps("invalid");
+  });
 
   auto helper = Trace(trace_config);
   PrintStats(helper.get());
@@ -1067,8 +949,10 @@
   // to be torn down (as it rejects concurrent sessions).
   usleep(500 * kMsToUs);
 
-  heapprofd_config.add_heaps("malloc");
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
+  trace_config = MakeTraceConfig([pid](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+  });
 
   PERFETTO_LOG("HeapprofdEndToEnd::ReinitAfterInvalid: Starting second");
   helper = Trace(trace_config);
@@ -1087,23 +971,12 @@
   base::Subprocess child = ForkContinuousMalloc(kAllocSize);
   const auto pid = child.pid();
 
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
+  TraceConfig trace_config = MakeTraceConfig([pid](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+    ContinuousDump(cfg);
+  });
   trace_config.set_duration_ms(5000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-  ds_config->set_target_buffer(0);
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid));
-  heapprofd_config.set_all(false);
-  auto* cont_config = heapprofd_config.mutable_continuous_dump_config();
-  cont_config->set_dump_phase_ms(0);
-  cont_config->set_dump_interval_ms(100);
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
 
   auto helper = GetHelper(&task_runner);
   helper->StartTracing(trace_config);
@@ -1159,24 +1032,18 @@
 
   // Construct tracing config (without starting profiling).
   auto helper = GetHelper(&task_runner);
-  TraceConfig trace_config;
-  trace_config.add_buffers()->set_size_kb(10 * 1024);
-  trace_config.set_duration_ms(5000);
-  trace_config.set_data_source_stop_timeout_ms(10000);
-
-  auto* ds_config = trace_config.add_data_sources()->mutable_config();
-  ds_config->set_name("android.heapprofd");
-
-  protos::gen::HeapprofdConfig heapprofd_config;
-  heapprofd_config.set_sampling_interval_bytes(1);
-  heapprofd_config.add_pid(static_cast<uint64_t>(pid));
-  ds_config->set_heapprofd_config_raw(heapprofd_config.SerializeAsString());
 
   // Wait for child to have been scheduled at least once.
   char buf[1] = {};
   ASSERT_EQ(PERFETTO_EINTR(read(*start_pipe.rd, buf, sizeof(buf))), 1);
   start_pipe.rd.reset();
 
+  TraceConfig trace_config = MakeTraceConfig([pid](HeapprofdConfig* cfg) {
+    cfg->set_sampling_interval_bytes(1);
+    cfg->add_pid(static_cast<uint64_t>(pid));
+  });
+  trace_config.set_duration_ms(5000);
+
   // Trace until child exits.
   helper->StartTracing(trace_config);