processor: Export pid/tid as signed integers into JSON Some old tooling doesn't support positive values larger than numeric_limits<int>::max(). So instead export very large pid/tid as negative ints. Bug: 130786269 Change-Id: I5d6e235acb32511abb3f736143e875e2c264123b
diff --git a/src/trace_processor/export_json.cc b/src/trace_processor/export_json.cc index 60f1095..ed6e5f8 100644 --- a/src/trace_processor/export_json.cc +++ b/src/trace_processor/export_json.cc
@@ -226,8 +226,8 @@ value["cat"] = "__metadata"; value["ts"] = 0; value["name"] = metadata_type; - value["pid"] = Json::UInt(pid); - value["tid"] = Json::UInt(tid); + value["pid"] = Json::Int(pid); + value["tid"] = Json::Int(tid); Json::Value args; args["name"] = metadata_value; @@ -692,8 +692,8 @@ // Synchronous (thread) slice or instant event. UniqueTid utid = thread_track.utid()[*opt_thread_track_row]; auto pid_and_tid = UtidToPidAndTid(utid); - event["pid"] = Json::UInt(pid_and_tid.first); - event["tid"] = Json::UInt(pid_and_tid.second); + event["pid"] = Json::Int(pid_and_tid.first); + event["tid"] = Json::Int(pid_and_tid.second); if (duration_ns == 0) { // Use "I" instead of "i" phase for backwards-compat with old @@ -739,10 +739,10 @@ PERFETTO_DCHECK(track_args); uint32_t upid = process_track.upid()[*opt_process_row]; uint32_t exported_pid = UpidToPid(upid); - event["pid"] = Json::UInt(exported_pid); + event["pid"] = Json::Int(exported_pid); event["tid"] = - Json::UInt(legacy_utid ? UtidToPidAndTid(*legacy_utid).second - : exported_pid); + Json::Int(legacy_utid ? UtidToPidAndTid(*legacy_utid).second + : exported_pid); // Preserve original event IDs for legacy tracks. This is so that e.g. // memory dump IDs show up correctly in the JSON trace. @@ -770,10 +770,10 @@ uint32_t upid = process_track.upid()[*opt_process_row]; event["id2"]["local"] = PrintUint64(track_id); uint32_t exported_pid = UpidToPid(upid); - event["pid"] = Json::UInt(exported_pid); + event["pid"] = Json::Int(exported_pid); event["tid"] = - Json::UInt(legacy_utid ? UtidToPidAndTid(*legacy_utid).second - : exported_pid); + Json::Int(legacy_utid ? UtidToPidAndTid(*legacy_utid).second + : exported_pid); } else { // Some legacy importers don't understand "id2" fields, so we use // the "usually" global "id" field instead. This works as long as @@ -826,10 +826,10 @@ if (opt_process_row.has_value()) { uint32_t upid = process_track.upid()[*opt_process_row]; uint32_t exported_pid = UpidToPid(upid); - event["pid"] = Json::UInt(exported_pid); + event["pid"] = Json::Int(exported_pid); event["tid"] = - Json::UInt(legacy_utid ? UtidToPidAndTid(*legacy_utid).second - : exported_pid); + Json::Int(legacy_utid ? UtidToPidAndTid(*legacy_utid).second + : exported_pid); event["s"] = "p"; } else { event["s"] = "g"; @@ -848,8 +848,8 @@ UniqueTid utid = static_cast<UniqueTid>(events.utid()[index]); auto pid_and_tid = UtidToPidAndTid(utid); - event["pid"] = Json::UInt(pid_and_tid.first); - event["tid"] = Json::UInt(pid_and_tid.second); + event["pid"] = Json::Int(pid_and_tid.first); + event["tid"] = Json::Int(pid_and_tid.second); // Raw legacy events store all other params in the arg set. Make a copy of // the converted args here, parse, and then remove the legacy params. @@ -963,8 +963,8 @@ UniqueTid utid = static_cast<UniqueTid>(samples.utid()[i]); auto pid_and_tid = UtidToPidAndTid(utid); - event["pid"] = Json::UInt(pid_and_tid.first); - event["tid"] = Json::UInt(pid_and_tid.second); + event["pid"] = Json::Int(pid_and_tid.first); + event["tid"] = Json::Int(pid_and_tid.second); event["ph"] = "n"; event["cat"] = "disabled_by_default-cpu_profiler"; @@ -1035,7 +1035,7 @@ // TODO(oysteine): Used for backwards compatibility with the memlog // pipeline, should remove once we've switched to looking directly at the // tid. - event["args"]["thread_id"] = Json::UInt(pid_and_tid.second); + event["args"]["thread_id"] = Json::Int(pid_and_tid.second); writer_.WriteCommonEvent(event); }
diff --git a/src/trace_processor/export_json_unittest.cc b/src/trace_processor/export_json_unittest.cc index 447f0fe..2c9ec19 100644 --- a/src/trace_processor/export_json_unittest.cc +++ b/src/trace_processor/export_json_unittest.cc
@@ -146,7 +146,7 @@ EXPECT_EQ(event["tdur"].asInt64(), kThreadDuration / 1000); EXPECT_EQ(event["ticount"].asInt64(), kThreadInstructionCount); EXPECT_EQ(event["tidelta"].asInt64(), kThreadInstructionDelta); - EXPECT_EQ(event["tid"].asUInt(), kThreadID); + EXPECT_EQ(event["tid"].asInt(), static_cast<int>(kThreadID)); EXPECT_EQ(event["cat"].asString(), kCategory); EXPECT_EQ(event["name"].asString(), kName); EXPECT_TRUE(event["args"].isObject()); @@ -192,7 +192,7 @@ EXPECT_FALSE(event.isMember("tdur")); EXPECT_EQ(event["ticount"].asInt64(), kThreadInstructionCount); EXPECT_FALSE(event.isMember("tidelta")); - EXPECT_EQ(event["tid"].asUInt(), kThreadID); + EXPECT_EQ(event["tid"].asInt(), static_cast<int>(kThreadID)); EXPECT_EQ(event["cat"].asString(), kCategory); EXPECT_EQ(event["name"].asString(), kName); EXPECT_TRUE(event["args"].isObject()); @@ -218,7 +218,7 @@ Json::Value event = result["traceEvents"][0]; EXPECT_EQ(event["ph"].asString(), "M"); - EXPECT_EQ(event["tid"].asUInt(), kThreadID); + EXPECT_EQ(event["tid"].asInt(), static_cast<int>(kThreadID)); EXPECT_EQ(event["name"].asString(), "thread_name"); EXPECT_EQ(event["args"]["name"].asString(), kName); } @@ -768,7 +768,7 @@ EXPECT_EQ(result["traceEvents"].size(), 1u); Json::Value event = result["traceEvents"][0]; - EXPECT_EQ(event["tid"].asUInt(), kThreadID); + EXPECT_EQ(event["tid"].asInt(), static_cast<int>(kThreadID)); EXPECT_EQ(event["ph"].asString(), "I"); EXPECT_EQ(event["ts"].asInt64(), kTimestamp / 1000); EXPECT_EQ(event["s"].asString(), "t"); @@ -842,40 +842,40 @@ Json::Value result = ToJsonValue(ReadFile(output)); EXPECT_EQ(result["traceEvents"].size(), 5u); - EXPECT_EQ(result["traceEvents"][0]["pid"].asUInt(), 1u); - EXPECT_EQ(result["traceEvents"][0]["tid"].asUInt(), 1u); + EXPECT_EQ(result["traceEvents"][0]["pid"].asInt(), 1); + EXPECT_EQ(result["traceEvents"][0]["tid"].asInt(), 1); EXPECT_EQ(result["traceEvents"][0]["ph"].asString(), "I"); EXPECT_EQ(result["traceEvents"][0]["ts"].asInt64(), 10); EXPECT_EQ(result["traceEvents"][0]["cat"].asString(), "cat"); EXPECT_EQ(result["traceEvents"][0]["name"].asString(), "name1a"); - EXPECT_EQ(result["traceEvents"][1]["pid"].asUInt(), 1u); - EXPECT_EQ(result["traceEvents"][1]["tid"].asUInt(), 2u); + EXPECT_EQ(result["traceEvents"][1]["pid"].asInt(), 1); + EXPECT_EQ(result["traceEvents"][1]["tid"].asInt(), 2); EXPECT_EQ(result["traceEvents"][1]["ph"].asString(), "X"); EXPECT_EQ(result["traceEvents"][1]["ts"].asInt64(), 20); EXPECT_EQ(result["traceEvents"][1]["dur"].asInt64(), 1); EXPECT_EQ(result["traceEvents"][1]["cat"].asString(), "cat"); EXPECT_EQ(result["traceEvents"][1]["name"].asString(), "name1b"); - EXPECT_EQ(result["traceEvents"][2]["pid"].asUInt(), 1u); - EXPECT_EQ(result["traceEvents"][2]["tid"].asUInt(), - static_cast<uint32_t>(std::numeric_limits<uint32_t>::max() - 1u)); + EXPECT_EQ(result["traceEvents"][2]["pid"].asInt(), 1); + EXPECT_EQ(result["traceEvents"][2]["tid"].asInt(), + static_cast<int>(std::numeric_limits<uint32_t>::max() - 1u)); EXPECT_EQ(result["traceEvents"][2]["ph"].asString(), "I"); EXPECT_EQ(result["traceEvents"][2]["ts"].asInt64(), 30); EXPECT_EQ(result["traceEvents"][2]["cat"].asString(), "cat"); EXPECT_EQ(result["traceEvents"][2]["name"].asString(), "name1c"); - EXPECT_EQ(result["traceEvents"][3]["pid"].asUInt(), - std::numeric_limits<uint32_t>::max()); - EXPECT_EQ(result["traceEvents"][3]["tid"].asUInt(), 1u); + EXPECT_EQ(result["traceEvents"][3]["pid"].asInt(), + static_cast<int>(std::numeric_limits<uint32_t>::max())); + EXPECT_EQ(result["traceEvents"][3]["tid"].asInt(), 1); EXPECT_EQ(result["traceEvents"][3]["ph"].asString(), "I"); EXPECT_EQ(result["traceEvents"][3]["ts"].asInt64(), 40); EXPECT_EQ(result["traceEvents"][3]["cat"].asString(), "cat"); EXPECT_EQ(result["traceEvents"][3]["name"].asString(), "name2a"); - EXPECT_EQ(result["traceEvents"][4]["pid"].asUInt(), - std::numeric_limits<uint32_t>::max()); - EXPECT_EQ(result["traceEvents"][4]["tid"].asUInt(), 2u); + EXPECT_EQ(result["traceEvents"][4]["pid"].asInt(), + static_cast<int>(std::numeric_limits<uint32_t>::max())); + EXPECT_EQ(result["traceEvents"][4]["tid"].asInt(), 2); EXPECT_EQ(result["traceEvents"][4]["ph"].asString(), "X"); EXPECT_EQ(result["traceEvents"][4]["ts"].asInt64(), 50); EXPECT_EQ(result["traceEvents"][1]["dur"].asInt64(), 1); @@ -931,7 +931,7 @@ Json::Value begin_event1 = result["traceEvents"][0]; EXPECT_EQ(begin_event1["ph"].asString(), "b"); EXPECT_EQ(begin_event1["ts"].asInt64(), kTimestamp / 1000); - EXPECT_EQ(begin_event1["pid"].asUInt(), kProcessID); + EXPECT_EQ(begin_event1["pid"].asInt(), static_cast<int>(kProcessID)); EXPECT_EQ(begin_event1["id2"]["local"].asString(), "0xeb"); EXPECT_EQ(begin_event1["cat"].asString(), kCategory); EXPECT_EQ(begin_event1["name"].asString(), kName); @@ -942,7 +942,7 @@ Json::Value begin_event2 = result["traceEvents"][1]; EXPECT_EQ(begin_event2["ph"].asString(), "b"); EXPECT_EQ(begin_event2["ts"].asInt64(), kTimestamp / 1000); - EXPECT_EQ(begin_event2["pid"].asUInt(), kProcessID); + EXPECT_EQ(begin_event2["pid"].asInt(), static_cast<int>(kProcessID)); EXPECT_EQ(begin_event2["id2"]["local"].asString(), "0xeb"); EXPECT_EQ(begin_event2["cat"].asString(), kCategory); EXPECT_EQ(begin_event2["name"].asString(), kName2); @@ -954,7 +954,7 @@ Json::Value end_event2 = result["traceEvents"][3]; EXPECT_EQ(end_event2["ph"].asString(), "e"); EXPECT_EQ(end_event2["ts"].asInt64(), (kTimestamp + kDuration) / 1000); - EXPECT_EQ(end_event2["pid"].asUInt(), kProcessID); + EXPECT_EQ(end_event2["pid"].asInt(), static_cast<int>(kProcessID)); EXPECT_EQ(end_event2["id2"]["local"].asString(), "0xeb"); EXPECT_EQ(end_event2["cat"].asString(), kCategory); EXPECT_EQ(end_event2["name"].asString(), kName); @@ -966,7 +966,7 @@ Json::Value end_event1 = result["traceEvents"][3]; EXPECT_EQ(end_event1["ph"].asString(), "e"); EXPECT_EQ(end_event1["ts"].asInt64(), (kTimestamp + kDuration) / 1000); - EXPECT_EQ(end_event1["pid"].asUInt(), kProcessID); + EXPECT_EQ(end_event1["pid"].asInt(), static_cast<int>(kProcessID)); EXPECT_EQ(end_event1["id2"]["local"].asString(), "0xeb"); EXPECT_EQ(end_event1["cat"].asString(), kCategory); EXPECT_EQ(end_event1["name"].asString(), kName); @@ -1014,7 +1014,7 @@ EXPECT_EQ(begin_event["ts"].asInt64(), kTimestamp / 1000); EXPECT_EQ(begin_event["tts"].asInt64(), kThreadTimestamp / 1000); EXPECT_EQ(begin_event["use_async_tts"].asInt(), 1); - EXPECT_EQ(begin_event["pid"].asUInt(), kProcessID); + EXPECT_EQ(begin_event["pid"].asInt(), static_cast<int>(kProcessID)); EXPECT_EQ(begin_event["id2"]["local"].asString(), "0xeb"); EXPECT_EQ(begin_event["cat"].asString(), kCategory); EXPECT_EQ(begin_event["name"].asString(), kName); @@ -1025,7 +1025,7 @@ EXPECT_EQ(end_event["tts"].asInt64(), (kThreadTimestamp + kThreadDuration) / 1000); EXPECT_EQ(end_event["use_async_tts"].asInt(), 1); - EXPECT_EQ(end_event["pid"].asUInt(), kProcessID); + EXPECT_EQ(end_event["pid"].asInt(), static_cast<int>(kProcessID)); EXPECT_EQ(end_event["id2"]["local"].asString(), "0xeb"); EXPECT_EQ(end_event["cat"].asString(), kCategory); EXPECT_EQ(end_event["name"].asString(), kName); @@ -1069,7 +1069,7 @@ EXPECT_EQ(begin_event["ts"].asInt64(), kTimestamp / 1000); EXPECT_EQ(begin_event["tts"].asInt64(), kThreadTimestamp / 1000); EXPECT_EQ(begin_event["use_async_tts"].asInt(), 1); - EXPECT_EQ(begin_event["pid"].asUInt(), kProcessID); + EXPECT_EQ(begin_event["pid"].asInt(), static_cast<int>(kProcessID)); EXPECT_EQ(begin_event["id2"]["local"].asString(), "0xeb"); EXPECT_EQ(begin_event["cat"].asString(), kCategory); EXPECT_EQ(begin_event["name"].asString(), kName); @@ -1116,7 +1116,7 @@ Json::Value event = result["traceEvents"][0]; EXPECT_EQ(event["ph"].asString(), "n"); EXPECT_EQ(event["ts"].asInt64(), kTimestamp / 1000); - EXPECT_EQ(event["pid"].asUInt(), kProcessID); + EXPECT_EQ(event["pid"].asInt(), static_cast<int>(kProcessID)); EXPECT_EQ(event["id2"]["local"].asString(), "0xeb"); EXPECT_EQ(event["cat"].asString(), kCategory); EXPECT_EQ(event["name"].asString(), kName); @@ -1204,7 +1204,7 @@ EXPECT_EQ(event["tdur"].asInt64(), kThreadDuration / 1000); EXPECT_EQ(event["ticount"].asInt64(), kThreadInstructionCount); EXPECT_EQ(event["tidelta"].asInt64(), kThreadInstructionDelta); - EXPECT_EQ(event["tid"].asUInt(), kThreadID); + EXPECT_EQ(event["tid"].asInt(), static_cast<int>(kThreadID)); EXPECT_EQ(event["cat"].asString(), kCategory); EXPECT_EQ(event["name"].asString(), kName); EXPECT_EQ(event["use_async_tts"].asInt(), 1); @@ -1328,7 +1328,7 @@ EXPECT_EQ(event["ph"].asString(), "n"); EXPECT_EQ(event["id"].asString(), "0x1"); EXPECT_EQ(event["ts"].asInt64(), kTimestamp / 1000); - EXPECT_EQ(event["tid"].asUInt(), kThreadID); + EXPECT_EQ(event["tid"].asInt(), static_cast<int>(kThreadID)); EXPECT_EQ(event["cat"].asString(), "disabled_by_default-cpu_profiler"); EXPECT_EQ(event["name"].asString(), "StackCpuSampling"); EXPECT_EQ(event["s"].asString(), "t"); @@ -1472,13 +1472,13 @@ EXPECT_EQ(result[0]["ph"].asString(), "X"); EXPECT_EQ(result[0]["ts"].asInt64(), kTimestamp1 / 1000); EXPECT_EQ(result[0]["dur"].asInt64(), kDuration / 1000); - EXPECT_EQ(result[0]["tid"].asUInt(), kThreadID); + EXPECT_EQ(result[0]["tid"].asInt(), static_cast<int>(kThreadID)); EXPECT_EQ(result[0]["cat"].asString(), kCategory); EXPECT_EQ(result[0]["name"].asString(), kName); EXPECT_EQ(result[1]["ph"].asString(), "X"); EXPECT_EQ(result[1]["ts"].asInt64(), kTimestamp2 / 1000); EXPECT_EQ(result[1]["dur"].asInt64(), kDuration / 1000); - EXPECT_EQ(result[1]["tid"].asUInt(), kThreadID); + EXPECT_EQ(result[1]["tid"].asInt(), static_cast<int>(kThreadID)); EXPECT_EQ(result[1]["cat"].asString(), kCategory); EXPECT_EQ(result[1]["name"].asString(), kName); }