[Lldb-commits] [lldb] Add download time for each module in statistics (PR #134563)
via lldb-commits
lldb-commits at lists.llvm.org
Mon Apr 7 11:31:39 PDT 2025
https://github.com/GeorgeHuyubo updated https://github.com/llvm/llvm-project/pull/134563
>From b4992fb5a841e546ef503f0257164b7d1f8c70ce Mon Sep 17 00:00:00 2001
From: George Hu <georgehuyubo at gmail.com>
Date: Fri, 4 Apr 2025 13:37:36 -0700
Subject: [PATCH] Add download time for each module in statistics
---
lldb/include/lldb/Symbol/SymbolFile.h | 5 +++
lldb/include/lldb/Target/Statistics.h | 1 +
lldb/include/lldb/Utility/FileSpec.h | 8 +++++
.../SymbolFile/DWARF/SymbolFileDWARF.cpp | 7 +++++
.../SymbolFile/DWARF/SymbolFileDWARF.h | 3 ++
.../Debuginfod/SymbolLocatorDebuginfod.cpp | 31 ++++++++++++-------
lldb/source/Target/Statistics.cpp | 8 +++++
lldb/source/Utility/FileSpec.cpp | 6 ++++
8 files changed, 58 insertions(+), 11 deletions(-)
diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h
index f35d3ee9f22ae..29fa99ba18323 100644
--- a/lldb/include/lldb/Symbol/SymbolFile.h
+++ b/lldb/include/lldb/Symbol/SymbolFile.h
@@ -422,6 +422,11 @@ class SymbolFile : public PluginInterface {
/// hasn't been indexed yet, or a valid duration if it has.
virtual StatsDuration::Duration GetDebugInfoIndexTime() { return {}; }
+ /// Return the time it took to download any extra symbol files.
+ ///
+ /// \returns 0.0 if no extra symbol files need to be downloaded
+ virtual double GetSymbolDownloadTime() { return 0.0; }
+
/// Reset the statistics for the symbol file.
virtual void ResetStatistics() {}
diff --git a/lldb/include/lldb/Target/Statistics.h b/lldb/include/lldb/Target/Statistics.h
index ee365357fcf31..2d3a7fcceec53 100644
--- a/lldb/include/lldb/Target/Statistics.h
+++ b/lldb/include/lldb/Target/Statistics.h
@@ -122,6 +122,7 @@ struct ModuleStats {
double symtab_index_time = 0.0;
double debug_parse_time = 0.0;
double debug_index_time = 0.0;
+ double symbol_download_time = 0.0;
uint64_t debug_info_size = 0;
bool symtab_loaded_from_cache = false;
bool symtab_saved_to_cache = false;
diff --git a/lldb/include/lldb/Utility/FileSpec.h b/lldb/include/lldb/Utility/FileSpec.h
index 3fa89b1dcff28..b59fa299c7f9b 100644
--- a/lldb/include/lldb/Utility/FileSpec.h
+++ b/lldb/include/lldb/Utility/FileSpec.h
@@ -75,6 +75,9 @@ class FileSpec {
/// \see FileSpec::SetFile (const char *path)
explicit FileSpec(llvm::StringRef path, Style style = Style::native);
+ explicit FileSpec(llvm::StringRef path, const double download_time,
+ Style style = Style::native);
+
explicit FileSpec(llvm::StringRef path, const llvm::Triple &triple);
bool DirectoryEquals(const FileSpec &other) const;
@@ -416,6 +419,9 @@ class FileSpec {
/// The lifetime of the StringRefs is tied to the lifetime of the FileSpec.
std::vector<llvm::StringRef> GetComponents() const;
+ /// Get the download time of the file.
+ double GetDownloadTime() { return m_download_time; }
+
protected:
// Convenience method for setting the file without changing the style.
void SetFile(llvm::StringRef path);
@@ -430,6 +436,8 @@ class FileSpec {
No
};
+ /// The download time of the file.
+ double m_download_time = 0.0;
/// The unique'd directory path.
ConstString m_directory;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index b95159d882bc7..8afb7b9dfb01c 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -4349,6 +4349,13 @@ LanguageType SymbolFileDWARF::GetLanguageFamily(DWARFUnit &unit) {
return LanguageTypeFromDWARF(lang);
}
+double SymbolFileDWARF::GetSymbolDownloadTime() {
+ double time = GetObjectFile()->GetFileSpec().GetDownloadTime();
+ if (m_dwp_symfile)
+ time += m_dwp_symfile->GetObjectFile()->GetFileSpec().GetDownloadTime();
+ return time;
+}
+
StatsDuration::Duration SymbolFileDWARF::GetDebugInfoIndexTime() {
if (m_index)
return m_index->GetIndexTime();
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 7309f7a86b659..16f609ee10807 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -309,6 +309,9 @@ class SymbolFileDWARF : public SymbolFileCommon {
StatsDuration::Duration GetDebugInfoParseTime() override {
return m_parse_time;
}
+
+ double GetSymbolDownloadTime() override;
+
StatsDuration::Duration GetDebugInfoIndexTime() override;
StatsDuration &GetDebugInfoParseTimeRef() { return m_parse_time; }
diff --git a/lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp b/lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp
index f9aa6b1a98765..3cfd1598b56b6 100644
--- a/lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp
+++ b/lldb/source/Plugins/SymbolLocator/Debuginfod/SymbolLocatorDebuginfod.cpp
@@ -188,17 +188,26 @@ GetFileForModule(const ModuleSpec &module_spec,
std::string cache_file_name = llvm::toHex(build_id, true);
if (!file_name.empty())
cache_file_name += "-" + file_name.str();
- llvm::Expected<std::string> result = llvm::getCachedOrDownloadArtifact(
- cache_file_name, url_path, cache_path, debuginfod_urls, timeout);
- if (result)
- return FileSpec(*result);
-
- Log *log = GetLog(LLDBLog::Symbols);
- auto err_message = llvm::toString(result.takeError());
- LLDB_LOGV(log,
- "Debuginfod failed to download symbol artifact {0} with error {1}",
- url_path, err_message);
- return {};
+ StatsDuration duration;
+ std::string local_path;
+ {
+ ElapsedTime elapsed(duration);
+ llvm::Expected<std::string> result = llvm::getCachedOrDownloadArtifact(
+ cache_file_name, url_path, cache_path, debuginfod_urls, timeout);
+
+ if (!result) {
+ Log *log = GetLog(LLDBLog::Symbols);
+ auto err_message = llvm::toString(result.takeError());
+ LLDB_LOGV(
+ log,
+ "Debuginfod failed to download symbol artifact {0} with error {1}",
+ url_path, err_message);
+ return {};
+ }
+ local_path = *result;
+ }
+
+ return FileSpec(local_path, duration.get().count());
}
std::optional<ModuleSpec> SymbolLocatorDebuginfod::LocateExecutableObjectFile(
diff --git a/lldb/source/Target/Statistics.cpp b/lldb/source/Target/Statistics.cpp
index b5d2e7bda1edf..73e96b6df36ec 100644
--- a/lldb/source/Target/Statistics.cpp
+++ b/lldb/source/Target/Statistics.cpp
@@ -71,6 +71,7 @@ json::Value ModuleStats::ToJSON() const {
module.try_emplace("debugInfoHadIncompleteTypes",
debug_info_had_incomplete_types);
module.try_emplace("symbolTableStripped", symtab_stripped);
+ module.try_emplace("symbolDownloadTime", symbol_download_time);
if (!symfile_path.empty())
module.try_emplace("symbolFilePath", symfile_path);
@@ -288,6 +289,7 @@ llvm::json::Value DebuggerStats::ReportStatistics(
json::Array json_targets;
json::Array json_modules;
+ double symbol_download_time = 0.0;
double symtab_parse_time = 0.0;
double symtab_index_time = 0.0;
double debug_parse_time = 0.0;
@@ -345,6 +347,10 @@ llvm::json::Value DebuggerStats::ReportStatistics(
++debug_index_saved;
module_stat.debug_index_time = sym_file->GetDebugInfoIndexTime().count();
module_stat.debug_parse_time = sym_file->GetDebugInfoParseTime().count();
+ module_stat.symbol_download_time += sym_file->GetSymbolDownloadTime();
+ if (sym_file->GetObjectFile() != module->GetObjectFile())
+ module_stat.symbol_download_time +=
+ module->GetObjectFile()->GetFileSpec().GetDownloadTime();
module_stat.debug_info_size =
sym_file->GetDebugInfoSize(load_all_debug_info);
module_stat.symtab_stripped = module->GetObjectFile()->IsStripped();
@@ -361,6 +367,7 @@ llvm::json::Value DebuggerStats::ReportStatistics(
if (module_stat.debug_info_had_variable_errors)
++num_modules_with_variable_errors;
}
+ symbol_download_time += module_stat.symbol_download_time;
symtab_parse_time += module_stat.symtab_parse_time;
symtab_index_time += module_stat.symtab_index_time;
debug_parse_time += module_stat.debug_parse_time;
@@ -391,6 +398,7 @@ llvm::json::Value DebuggerStats::ReportStatistics(
}
json::Object global_stats{
+ {"totalSymbolDownloadTime", symbol_download_time},
{"totalSymbolTableParseTime", symtab_parse_time},
{"totalSymbolTableIndexTime", symtab_index_time},
{"totalSymbolTablesLoadedFromCache", symtabs_loaded},
diff --git a/lldb/source/Utility/FileSpec.cpp b/lldb/source/Utility/FileSpec.cpp
index bb2b8647342b8..89c3eba44c306 100644
--- a/lldb/source/Utility/FileSpec.cpp
+++ b/lldb/source/Utility/FileSpec.cpp
@@ -72,6 +72,12 @@ FileSpec::FileSpec(llvm::StringRef path, Style style) : m_style(style) {
SetFile(path, style);
}
+FileSpec::FileSpec(llvm::StringRef path, const double download_time,
+ Style style)
+ : m_download_time(download_time) {
+ SetFile(path, style);
+}
+
FileSpec::FileSpec(llvm::StringRef path, const llvm::Triple &triple)
: FileSpec{path, triple.isOSWindows() ? Style::windows : Style::posix} {}
More information about the lldb-commits
mailing list