-
Notifications
You must be signed in to change notification settings - Fork 13.6k
[LLDB][Telemetry]Define TargetInfo for collecting data about a target #127834
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 29 commits
0d6a36d
19c6181
f152b3b
4f8555a
a5bd22e
bb22874
f49c3e2
3bd8897
d3cb8d8
267345a
32d949b
5c6c83c
39c39cc
1fdf120
1ed73e7
92e06fa
aab5002
31c63e0
20c8f59
9954083
55aa4ee
c8ca5b8
4783b57
ae73ebe
0a2505a
4d3d26e
b1b7a50
f7be9c9
41f0696
5e99cc7
a709ac3
220554a
1ecbe48
1231bc2
5757b41
a936e2e
142097a
d297813
885675e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -23,9 +23,12 @@ | |||||
#include <atomic> | ||||||
#include <chrono> | ||||||
#include <ctime> | ||||||
#include <functional> | ||||||
#include <memory> | ||||||
#include <optional> | ||||||
#include <string> | ||||||
#include <type_traits> | ||||||
#include <utility> | ||||||
|
||||||
namespace lldb_private { | ||||||
namespace telemetry { | ||||||
|
@@ -46,12 +49,18 @@ struct LLDBConfig : public ::llvm::telemetry::Config { | |||||
// Specifically: | ||||||
// - Length: 8 bits | ||||||
// - First two bits (MSB) must be 11 - the common prefix | ||||||
// - Last two bits (LSB) are reserved for grand-children of LLDBTelemetryInfo | ||||||
// If any of the subclass has descendents, those descendents | ||||||
// must have their LLDBEntryKind in the similar form (ie., share common prefix) | ||||||
// must have their LLDBEntryKind in the similar form (ie., share common prefix | ||||||
// and differ by the last two bits) | ||||||
struct LLDBEntryKind : public ::llvm::telemetry::EntryKind { | ||||||
static const llvm::telemetry::KindType BaseInfo = 0b11000000; | ||||||
static const llvm::telemetry::KindType CommandInfo = 0b11010000; | ||||||
static const llvm::telemetry::KindType DebuggerInfo = 0b11000100; | ||||||
// clang-format off | ||||||
static const llvm::telemetry::KindType BaseInfo = 0b11000000; | ||||||
static const llvm::telemetry::KindType CommandInfo = 0b11010000; | ||||||
static const llvm::telemetry::KindType DebuggerInfo = 0b11001000; | ||||||
static const llvm::telemetry::KindType ExecModuleInfo = 0b11000100; | ||||||
static const llvm::telemetry::KindType ProcessExitInfo = 0b11001100; | ||||||
// clang-format on | ||||||
}; | ||||||
|
||||||
/// Defines a convenient type for timestamp of various events. | ||||||
|
@@ -146,6 +155,59 @@ struct DebuggerInfo : public LLDBBaseTelemetryInfo { | |||||
void serialize(llvm::telemetry::Serializer &serializer) const override; | ||||||
}; | ||||||
|
||||||
struct ExecModuleInfo : public LLDBBaseTelemetryInfo { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
lldb::ModuleSP exec_mod; | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's drop the
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||||||
|
||||||
/// The same as the executable-module's UUID. | ||||||
UUID exec_uuid; | ||||||
/// PID of the process owned by this target. | ||||||
lldb::pid_t pid; | ||||||
/// The triple of this executable module. | ||||||
std::string triple; | ||||||
|
||||||
/// If true, this entry was emitted at the beginning of an event (eg., before | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
/// the executable is set). Otherwise, it was emitted at the end of an | ||||||
/// event (eg., after the module and any dependency were loaded.) | ||||||
bool is_start_entry; | ||||||
|
||||||
ExecModuleInfo() = default; | ||||||
|
||||||
llvm::telemetry::KindType getKind() const override { | ||||||
return LLDBEntryKind::ExecModuleInfo; | ||||||
} | ||||||
|
||||||
static bool classof(const TelemetryInfo *T) { | ||||||
// Subclasses of this is also acceptable | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
return (T->getKind() & LLDBEntryKind::ExecModuleInfo) == | ||||||
LLDBEntryKind::ExecModuleInfo; | ||||||
} | ||||||
void serialize(llvm::telemetry::Serializer &serializer) const override; | ||||||
}; | ||||||
|
||||||
/// Describes an exit status. | ||||||
struct ExitDescription { | ||||||
int exit_code; | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Contrary to my other comments I think we can keep the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||||||
std::string description; | ||||||
}; | ||||||
|
||||||
struct ProcessExitInfo : public LLDBBaseTelemetryInfo { | ||||||
UUID exec_uuid; | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||||||
lldb::pid_t pid; | ||||||
bool is_start_entry; | ||||||
std::optional<ExitDescription> exit_desc; | ||||||
|
||||||
llvm::telemetry::KindType getKind() const override { | ||||||
return LLDBEntryKind::ProcessExitInfo; | ||||||
} | ||||||
|
||||||
static bool classof(const TelemetryInfo *T) { | ||||||
// Subclasses of this is also acceptable | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
return (T->getKind() & LLDBEntryKind::ProcessExitInfo) == | ||||||
LLDBEntryKind::ProcessExitInfo; | ||||||
} | ||||||
void serialize(llvm::telemetry::Serializer &serializer) const override; | ||||||
}; | ||||||
|
||||||
/// The base Telemetry manager instance in LLDB. | ||||||
/// This class declares additional instrumentation points | ||||||
/// applicable to LLDB. | ||||||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -76,15 +76,36 @@ void CommandInfo::serialize(Serializer &serializer) const { | |||||
serializer.write("error_data", error_data.value()); | ||||||
} | ||||||
|
||||||
std::atomic<uint64_t> CommandInfo::g_command_id_seed = 0; | ||||||
uint64_t CommandInfo::GetNextId() { return g_command_id_seed.fetch_add(1); } | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||||||
|
||||||
void DebuggerInfo::serialize(Serializer &serializer) const { | ||||||
LLDBBaseTelemetryInfo::serialize(serializer); | ||||||
|
||||||
serializer.write("lldb_version", lldb_version); | ||||||
serializer.write("is_exit_entry", is_exit_entry); | ||||||
} | ||||||
|
||||||
std::atomic<uint64_t> CommandInfo::g_command_id_seed = 0; | ||||||
uint64_t CommandInfo::GetNextId() { return g_command_id_seed.fetch_add(1); } | ||||||
void ExecModuleInfo::serialize(Serializer &serializer) const { | ||||||
LLDBBaseTelemetryInfo::serialize(serializer); | ||||||
|
||||||
serializer.write("exec_uuid", exec_uuid.GetAsString()); | ||||||
serializer.write("pid", pid); | ||||||
serializer.write("triple", triple); | ||||||
serializer.write("is_start_entry", is_start_entry); | ||||||
} | ||||||
|
||||||
void ProcessExitInfo::serialize(Serializer &serializer) const { | ||||||
LLDBBaseTelemetryInfo::serialize(serializer); | ||||||
|
||||||
serializer.write("exec_uuid", exec_uuid.GetAsString()); | ||||||
serializer.write("pid", pid); | ||||||
serializer.write("is_start_entry", is_start_entry); | ||||||
if (exit_desc.has_value()) { | ||||||
serializer.write("exit_code", exit_desc->exit_code); | ||||||
serializer.write("exit_desc", exit_desc->description); | ||||||
} | ||||||
} | ||||||
|
||||||
TelemetryManager::TelemetryManager(std::unique_ptr<LLDBConfig> config) | ||||||
: m_config(std::move(config)), m_id(MakeUUID()) {} | ||||||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -22,6 +22,7 @@ | |||||
#include "lldb/Core/ModuleSpec.h" | ||||||
#include "lldb/Core/PluginManager.h" | ||||||
#include "lldb/Core/Progress.h" | ||||||
#include "lldb/Core/Telemetry.h" | ||||||
#include "lldb/Expression/DiagnosticManager.h" | ||||||
#include "lldb/Expression/DynamicCheckerFunctions.h" | ||||||
#include "lldb/Expression/UserExpression.h" | ||||||
|
@@ -1066,6 +1067,26 @@ const char *Process::GetExitDescription() { | |||||
bool Process::SetExitStatus(int status, llvm::StringRef exit_string) { | ||||||
// Use a mutex to protect setting the exit status. | ||||||
std::lock_guard<std::mutex> guard(m_exit_status_mutex); | ||||||
telemetry::ScopedDispatcher<telemetry::ProcessExitInfo> helper; | ||||||
|
||||||
// Find the executable-module's UUID, if available. | ||||||
Target &target = GetTarget(); | ||||||
helper.SetDebugger(&(target.GetDebugger())); | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||||||
UUID exec_uuid; | ||||||
if (ModuleSP exec_mod = target.GetExecutableModule()) | ||||||
exec_uuid = exec_mod->GetUUID(); | ||||||
|
||||||
helper.DispatchNow([&](telemetry::ProcessExitInfo *info) { | ||||||
info->exec_uuid = exec_uuid; | ||||||
info->pid = m_pid; | ||||||
info->is_start_entry = true; | ||||||
info->exit_desc = {status, exit_string.str()}; | ||||||
}); | ||||||
|
||||||
helper.DispatchOnExit([&](telemetry::ProcessExitInfo *info) { | ||||||
info->exec_uuid = exec_uuid; | ||||||
info->pid = m_pid; | ||||||
}); | ||||||
|
||||||
Log *log(GetLog(LLDBLog::State | LLDBLog::Process)); | ||||||
LLDB_LOG(log, "(plugin = {0} status = {1} ({1:x8}), description=\"{2}\")", | ||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -24,6 +24,7 @@ | |||||||||||||
#include "lldb/Core/Section.h" | ||||||||||||||
#include "lldb/Core/SourceManager.h" | ||||||||||||||
#include "lldb/Core/StructuredDataImpl.h" | ||||||||||||||
#include "lldb/Core/Telemetry.h" | ||||||||||||||
#include "lldb/DataFormatters/FormatterSection.h" | ||||||||||||||
#include "lldb/Expression/DiagnosticManager.h" | ||||||||||||||
#include "lldb/Expression/ExpressionVariable.h" | ||||||||||||||
|
@@ -1559,10 +1560,29 @@ void Target::DidExec() { | |||||||||||||
|
||||||||||||||
void Target::SetExecutableModule(ModuleSP &executable_sp, | ||||||||||||||
LoadDependentFiles load_dependent_files) { | ||||||||||||||
telemetry::ScopedDispatcher<telemetry::ExecModuleInfo> helper(&m_debugger); | ||||||||||||||
Log *log = GetLog(LLDBLog::Target); | ||||||||||||||
ClearModules(false); | ||||||||||||||
|
||||||||||||||
if (executable_sp) { | ||||||||||||||
lldb::pid_t pid; | ||||||||||||||
if (ProcessSP proc = GetProcessSP()) | ||||||||||||||
pid = proc->GetID(); | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||||||||||||||
|
||||||||||||||
helper.DispatchNow([&](telemetry::ExecModuleInfo *info) { | ||||||||||||||
info->exec_mod = executable_sp; | ||||||||||||||
info->exec_uuid = executable_sp->GetUUID(); | ||||||||||||||
info->pid = pid; | ||||||||||||||
info->triple = executable_sp->GetArchitecture().GetTriple().getTriple(); | ||||||||||||||
info->is_start_entry = true; | ||||||||||||||
}); | ||||||||||||||
|
||||||||||||||
helper.DispatchOnExit([&](telemetry::ExecModuleInfo *info) { | ||||||||||||||
info->exec_mod = executable_sp; | ||||||||||||||
info->exec_uuid = executable_sp->GetUUID(); | ||||||||||||||
info->pid = pid; | ||||||||||||||
}); | ||||||||||||||
|
||||||||||||||
ElapsedTime elapsed(m_stats.GetCreateTime()); | ||||||||||||||
LLDB_SCOPED_TIMERF("Target::SetExecutableModule (executable = '%s')", | ||||||||||||||
executable_sp->GetFileSpec().GetPath().c_str()); | ||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have to say I'm liking this bitfield system less and less every time I see it.