Skip to content

Commit 13f6417

Browse files
committed
traceconv: implement function to go from text -> binary
Implement it in a very trivial way but better than not having it at all
1 parent 89ae182 commit 13f6417

File tree

2 files changed

+42
-11
lines changed

2 files changed

+42
-11
lines changed

src/traceconv/BUILD.gn

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,16 @@ source_set("lib") {
8383
"../../include/perfetto/ext/traced:sys_stats_counters",
8484
"../../include/perfetto/protozero",
8585
"../../protos/perfetto/trace:zero",
86-
"../../src/profiling:deobfuscator",
87-
"../../src/profiling/symbolizer",
88-
"../../src/profiling/symbolizer:symbolize_database",
89-
"../../src/protozero:proto_ring_buffer",
90-
"../../src/trace_processor:lib",
91-
"../../src/trace_processor:storage_minimal",
92-
"../../src/trace_processor/util:descriptors",
93-
"../../src/trace_processor/util:gzip",
94-
"../../src/trace_processor/util:protozero_to_text",
95-
"../../src/trace_processor/util:trace_type",
86+
"../profiling:deobfuscator",
87+
"../profiling/symbolizer",
88+
"../profiling/symbolizer:symbolize_database",
89+
"../protozero:proto_ring_buffer",
90+
"../trace_processor:lib",
91+
"../trace_processor:storage_minimal",
92+
"../trace_processor/util:descriptors",
93+
"../trace_processor/util:gzip",
94+
"../trace_processor/util:protozero_to_text",
95+
"../trace_processor/util:trace_type",
9696
]
9797
sources = [
9898
"deobfuscate_profile.cc",
@@ -119,10 +119,12 @@ source_set("lib") {
119119

120120
source_set("main") {
121121
deps = [
122+
":gen_cc_trace_descriptor",
122123
":lib",
123124
"../../gn:default_deps",
124125
"../../include/perfetto/ext/base:base",
125126
"../base:version",
127+
"../protozero/text_to_proto",
126128
]
127129
sources = [ "main.cc" ]
128130
}

src/traceconv/main.cc

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,24 @@
1616

1717
#include <stdio.h>
1818

19+
#include <cstdint>
20+
#include <cstdlib>
21+
#include <cstring>
1922
#include <fstream>
2023
#include <iostream>
24+
#include <iterator>
2125
#include <limits>
26+
#include <string>
2227
#include <vector>
2328

29+
#include "perfetto/base/build_config.h"
2430
#include "perfetto/base/logging.h"
2531
#include "perfetto/ext/base/string_utils.h"
2632
#include "perfetto/ext/base/version.h"
33+
#include "src/protozero/text_to_proto/text_to_proto.h"
2734
#include "src/traceconv/deobfuscate_profile.h"
2835
#include "src/traceconv/symbolize_profile.h"
36+
#include "src/traceconv/trace.descriptor.h"
2937
#include "src/traceconv/trace_to_firefox.h"
3038
#include "src/traceconv/trace_to_hprof.h"
3139
#include "src/traceconv/trace_to_json.h"
@@ -51,7 +59,7 @@ int Usage(const char* argv0) {
5159
"Usage: %s MODE [OPTIONS] [input file] [output file]\n"
5260
"modes:\n"
5361
" systrace|json|ctrace|text|profile|hprof|symbolize|deobfuscate|firefox"
54-
"|java_heap_profile|decompress_packets\n"
62+
"|java_heap_profile|decompress_packets|binary\n"
5563
"options:\n"
5664
" [--truncate start|end]\n"
5765
" [--full-sort]\n"
@@ -76,6 +84,23 @@ uint64_t StringToUint64OrDie(const char* str) {
7684
return number;
7785
}
7886

87+
uint64_t TextToTrace(std::istream* input, std::ostream* output) {
88+
std::string trace_text((std::istreambuf_iterator<char>(*input)),
89+
(std::istreambuf_iterator<char>()));
90+
auto proto_status =
91+
protozero::TextToProto(kTraceDescriptor.data(), kTraceDescriptor.size(),
92+
".perfetto.protos.Trace", "trace", trace_text);
93+
if (!proto_status.ok()) {
94+
PERFETTO_ELOG("Failed to parse trace: %s",
95+
proto_status.status().c_message());
96+
return 1;
97+
}
98+
const std::vector<uint8_t>& trace_proto = proto_status.value();
99+
output->write(reinterpret_cast<const char*>(trace_proto.data()),
100+
static_cast<int64_t>(trace_proto.size()));
101+
return 0;
102+
}
103+
79104
int Main(int argc, char** argv) {
80105
std::vector<const char*> positional_args;
81106
Keep truncate_keep = Keep::kAll;
@@ -176,6 +201,10 @@ int Main(int argc, char** argv) {
176201
return 1;
177202
}
178203

204+
if (format == "binary") {
205+
return TextToTrace(input_stream, output_stream);
206+
}
207+
179208
if (format == "json")
180209
return TraceToJson(input_stream, output_stream, /*compress=*/false,
181210
truncate_keep, full_sort);

0 commit comments

Comments
 (0)