blob: f5bb1b2d182061931afcfbab2ffff43e8f8edab4 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_ARGS_TRANSLATION_TABLE_H_
#define SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_ARGS_TRANSLATION_TABLE_H_
#include <cstdint>
#include <optional>
#include "perfetto/ext/base/flat_hash_map.h"
#include "perfetto/ext/base/string_view.h"
#include "src/trace_processor/importers/common/args_tracker.h"
#include "src/trace_processor/importers/common/deobfuscation_mapping_table.h"
#include "src/trace_processor/storage/trace_storage.h"
#include "src/trace_processor/util/proto_to_args_parser.h"
template <>
struct std::hash<std::pair<perfetto::trace_processor::MappingId, uint64_t>> {
size_t operator()(const std::pair<perfetto::trace_processor::MappingId,
uint64_t>& p) const {
return std::hash<perfetto::trace_processor::MappingId>{}(p.first) ^
std::hash<uint64_t>{}(p.second);
}
};
namespace perfetto {
namespace trace_processor {
// Tracks and stores args translation rules. It allows Trace Processor
// to map for example hashes to their names.
class ArgsTranslationTable {
public:
using Key = util::ProtoToArgsParser::Key;
using NativeSymbolKey = std::pair<MappingId, uint64_t>;
struct SourceLocation {
std::string file_name;
std::string function_name;
uint32_t line_number;
};
explicit ArgsTranslationTable(TraceStorage* storage);
// Returns true if an arg with the given key and type requires translation.
bool NeedsTranslation(StringId flat_key_id,
StringId key_id,
Variadic::Type type) const;
void TranslateArgs(const ArgsTracker::CompactArgSet& arg_set,
ArgsTracker::BoundInserter& inserter) const;
void AddChromeHistogramTranslationRule(uint64_t hash, base::StringView name) {
chrome_histogram_hash_to_name_.Insert(hash, name.ToStdString());
}
void AddChromeUserEventTranslationRule(uint64_t hash,
base::StringView action) {
chrome_user_event_hash_to_action_.Insert(hash, action.ToStdString());
}
void AddChromePerformanceMarkSiteTranslationRule(uint64_t hash,
base::StringView name) {
chrome_performance_mark_site_hash_to_name_.Insert(hash, name.ToStdString());
}
void AddChromePerformanceMarkMarkTranslationRule(uint64_t hash,
base::StringView name) {
chrome_performance_mark_mark_hash_to_name_.Insert(hash, name.ToStdString());
}
void AddNativeSymbolTranslationRule(MappingId mapping_id,
uint64_t rel_pc,
const SourceLocation& loc) {
native_symbol_to_location_.Insert(std::make_pair(mapping_id, rel_pc), loc);
}
void AddDeobfuscationMappingTable(
DeobfuscationMappingTable deobfuscation_mapping_table) {
deobfuscation_mapping_table_ = std::move(deobfuscation_mapping_table);
}
std::optional<base::StringView> TranslateChromeHistogramHashForTesting(
uint64_t hash) const {
return TranslateChromeHistogramHash(hash);
}
std::optional<base::StringView> TranslateChromeUserEventHashForTesting(
uint64_t hash) const {
return TranslateChromeUserEventHash(hash);
}
std::optional<base::StringView>
TranslateChromePerformanceMarkSiteHashForTesting(uint64_t hash) const {
return TranslateChromePerformanceMarkSiteHash(hash);
}
std::optional<base::StringView>
TranslateChromePerformanceMarkMarkHashForTesting(uint64_t hash) const {
return TranslateChromePerformanceMarkMarkHash(hash);
}
std::optional<StringId> TranslateClassNameForTesting(
StringId obfuscated_class_name_id) const {
return TranslateClassName(obfuscated_class_name_id);
}
private:
enum class KeyType {
kChromeHistogramHash = 0,
kChromeUserEventHash = 1,
kChromePerformanceMarkMarkHash = 2,
kChromePerformanceMarkSiteHash = 3,
kMojoMethodMappingId = 4,
kMojoMethodRelPc = 5,
kClassName = 6,
};
static constexpr char kChromeHistogramHashKey[] =
"chrome_histogram_sample.name_hash";
static constexpr char kChromeHistogramNameKey[] =
"chrome_histogram_sample.name";
static constexpr char kChromeUserEventHashKey[] =
"chrome_user_event.action_hash";
static constexpr char kChromeUserEventActionKey[] =
"chrome_user_event.action";
static constexpr char kChromePerformanceMarkSiteHashKey[] =
"chrome_hashed_performance_mark.site_hash";
static constexpr char kChromePerformanceMarkSiteKey[] =
"chrome_hashed_performance_mark.site";
static constexpr char kChromePerformanceMarkMarkHashKey[] =
"chrome_hashed_performance_mark.mark_hash";
static constexpr char kChromePerformanceMarkMarkKey[] =
"chrome_hashed_performance_mark.mark";
static constexpr char kMojoMethodMappingIdKey[] =
"chrome_mojo_event_info.mojo_interface_method.native_symbol.mapping_id";
static constexpr char kMojoMethodRelPcKey[] =
"chrome_mojo_event_info.mojo_interface_method.native_symbol.rel_pc";
static constexpr char kMojoMethodNameKey[] =
"chrome_mojo_event_info.mojo_method_name";
static constexpr char kMojoIntefaceTagKey[] =
"chrome_mojo_event_info.mojo_interface_tag";
static constexpr char kObfuscatedViewDumpClassNameFlatKey[] =
"android_view_dump.activity.view.class_name";
TraceStorage* storage_;
StringId interned_chrome_histogram_hash_key_;
StringId interned_chrome_histogram_name_key_;
StringId interned_chrome_user_event_hash_key_;
StringId interned_chrome_user_event_action_key_;
StringId interned_chrome_performance_mark_site_hash_key_;
StringId interned_chrome_performance_mark_site_key_;
StringId interned_chrome_performance_mark_mark_hash_key_;
StringId interned_chrome_performance_mark_mark_key_;
StringId interned_mojo_method_mapping_id_;
StringId interned_mojo_method_rel_pc_;
StringId interned_mojo_method_name_;
StringId interned_mojo_interface_tag_;
// A "flat_key" of an argument from the "args" table that has to be
// deobfuscated. A Java class name must be contained in this argument.
StringId interned_obfuscated_view_dump_class_name_flat_key_;
base::FlatHashMap<uint64_t, std::string> chrome_histogram_hash_to_name_;
base::FlatHashMap<uint64_t, std::string> chrome_user_event_hash_to_action_;
base::FlatHashMap<uint64_t, std::string>
chrome_performance_mark_site_hash_to_name_;
base::FlatHashMap<uint64_t, std::string>
chrome_performance_mark_mark_hash_to_name_;
base::FlatHashMap<NativeSymbolKey, SourceLocation> native_symbol_to_location_;
// A translation mapping for obfuscated Java class names and its members.
DeobfuscationMappingTable deobfuscation_mapping_table_;
// Returns the corresponding SupportedKey enum if the table knows how to
// translate the argument with the given key and type, and std::nullopt
// otherwise.
std::optional<KeyType> KeyIdAndTypeToEnum(StringId flat_key_id,
StringId key_id,
Variadic::Type type) const;
std::optional<base::StringView> TranslateChromeHistogramHash(
uint64_t hash) const;
std::optional<base::StringView> TranslateChromeUserEventHash(
uint64_t hash) const;
std::optional<base::StringView> TranslateChromePerformanceMarkSiteHash(
uint64_t hash) const;
std::optional<base::StringView> TranslateChromePerformanceMarkMarkHash(
uint64_t hash) const;
std::optional<SourceLocation> TranslateNativeSymbol(MappingId mapping_id,
uint64_t rel_pc) const;
// Returns the deobfuscated name of a Java class or std::nullopt if
// translation is not found.
std::optional<StringId> TranslateClassName(
StringId obfuscated_class_name_id) const;
void EmitMojoMethodLocation(std::optional<uint64_t> mapping_id,
std::optional<uint64_t> rel_pc,
ArgsTracker::BoundInserter& inserter) const;
};
} // namespace trace_processor
} // namespace perfetto
#endif // SRC_TRACE_PROCESSOR_IMPORTERS_COMMON_ARGS_TRANSLATION_TABLE_H_