LLDB mainline
Statistics.cpp
Go to the documentation of this file.
1//===-- Statistics.cpp ----------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10
11#include "lldb/Core/Debugger.h"
12#include "lldb/Core/Module.h"
17#include "lldb/Target/Process.h"
18#include "lldb/Target/Target.h"
21
22using namespace lldb;
23using namespace lldb_private;
24using namespace llvm;
25
26static void EmplaceSafeString(llvm::json::Object &obj, llvm::StringRef key,
27 const std::string &str) {
28 if (str.empty())
29 return;
30 if (LLVM_LIKELY(llvm::json::isUTF8(str)))
31 obj.try_emplace(key, str);
32 else
33 obj.try_emplace(key, llvm::json::fixUTF8(str));
34}
35
36json::Value StatsSuccessFail::ToJSON() const {
37 return json::Object{{"successes", successes}, {"failures", failures}};
38}
39
40static double elapsed(const StatsTimepoint &start, const StatsTimepoint &end) {
42 end.time_since_epoch() - start.time_since_epoch();
43 return elapsed.count();
44}
45
48 for (ModuleSP module_sp : target.GetImages().Modules())
49 m_module_identifiers.emplace_back((intptr_t)module_sp.get());
50}
51
52json::Value ModuleStats::ToJSON() const {
53 json::Object module;
54 EmplaceSafeString(module, "path", path);
55 EmplaceSafeString(module, "uuid", uuid);
56 EmplaceSafeString(module, "triple", triple);
57 module.try_emplace("identifier", identifier);
58 module.try_emplace("symbolTableParseTime", symtab_parse_time);
59 module.try_emplace("symbolTableIndexTime", symtab_index_time);
60 module.try_emplace("symbolTableLoadedFromCache", symtab_loaded_from_cache);
61 module.try_emplace("symbolTableSavedToCache", symtab_saved_to_cache);
62 module.try_emplace("debugInfoParseTime", debug_parse_time);
63 module.try_emplace("debugInfoIndexTime", debug_index_time);
64 module.try_emplace("debugInfoByteSize", (int64_t)debug_info_size);
65 module.try_emplace("debugInfoIndexLoadedFromCache",
66 debug_info_index_loaded_from_cache);
67 module.try_emplace("debugInfoIndexSavedToCache",
68 debug_info_index_saved_to_cache);
69 module.try_emplace("debugInfoEnabled", debug_info_enabled);
70 module.try_emplace("debugInfoHadVariableErrors",
71 debug_info_had_variable_errors);
72 module.try_emplace("debugInfoHadIncompleteTypes",
73 debug_info_had_incomplete_types);
74 module.try_emplace("symbolTableStripped", symtab_stripped);
75 module.try_emplace("symbolTableSymbolCount", symtab_symbol_count);
76 module.try_emplace("dwoFileCount", dwo_stats.dwo_file_count);
77 module.try_emplace("loadedDwoFileCount", dwo_stats.loaded_dwo_file_count);
78 module.try_emplace("dwoErrorCount", dwo_stats.dwo_error_count);
79
80 if (!symbol_locator_time.map.empty()) {
81 json::Object obj;
82 for (const auto &entry : symbol_locator_time.map)
83 obj.try_emplace(entry.first().str(), entry.second);
84 module.try_emplace("symbolLocatorTime", std::move(obj));
85 }
86
87 if (!symfile_path.empty())
88 module.try_emplace("symbolFilePath", symfile_path);
89
90 if (!symfile_modules.empty()) {
91 json::Array symfile_ids;
92 for (const auto symfile_id : symfile_modules)
93 symfile_ids.emplace_back(symfile_id);
94 module.try_emplace("symbolFileModuleIdentifiers", std::move(symfile_ids));
95 }
96
97 if (!type_system_stats.empty()) {
98 json::Array type_systems;
99 for (const auto &entry : type_system_stats) {
100 json::Object obj;
101 obj.try_emplace(entry.first().str(), entry.second);
102 type_systems.emplace_back(std::move(obj));
103 }
104 module.try_emplace("typeSystemInfo", std::move(type_systems));
105 }
106
107 return module;
108}
109
110llvm::json::Value ConstStringStats::ToJSON() const {
111 json::Object obj;
112 obj.try_emplace<int64_t>("bytesTotal", stats.GetBytesTotal());
113 obj.try_emplace<int64_t>("bytesUsed", stats.GetBytesUsed());
114 obj.try_emplace<int64_t>("bytesUnused", stats.GetBytesUnused());
115 return obj;
116}
117
118json::Value
120 const lldb_private::StatisticsOptions &options) {
121 json::Object target_metrics_json;
122 ProcessSP process_sp = target.GetProcessSP();
123 const bool summary_only = options.GetSummaryOnly();
124 const bool include_modules = options.GetIncludeModules();
125 if (!summary_only) {
126 CollectStats(target);
127
128 json::Array json_module_uuid_array;
129 for (auto module_identifier : m_module_identifiers)
130 json_module_uuid_array.emplace_back(module_identifier);
131
132 target_metrics_json.try_emplace(m_expr_eval.name, m_expr_eval.ToJSON());
133 target_metrics_json.try_emplace(m_frame_var.name, m_frame_var.ToJSON());
134 if (include_modules)
135 target_metrics_json.try_emplace("moduleIdentifiers",
136 std::move(json_module_uuid_array));
137
139 double elapsed_time =
141 target_metrics_json.try_emplace("launchOrAttachTime", elapsed_time);
142 }
144 double elapsed_time =
146 target_metrics_json.try_emplace("firstStopTime", elapsed_time);
147 }
148 target_metrics_json.try_emplace("targetCreateTime",
149 m_create_time.get().count());
150
151 json::Array breakpoints_array;
152 double totalBreakpointResolveTime = 0.0;
153 // Report both the normal breakpoint list and the internal breakpoint list.
154 for (int i = 0; i < 2; ++i) {
155 BreakpointList &breakpoints = target.GetBreakpointList(i == 1);
156 std::unique_lock<std::recursive_mutex> lock;
157 breakpoints.GetListMutex(lock);
158 size_t num_breakpoints = breakpoints.GetSize();
159 for (size_t i = 0; i < num_breakpoints; i++) {
160 Breakpoint *bp = breakpoints.GetBreakpointAtIndex(i).get();
161 breakpoints_array.push_back(bp->GetStatistics());
162 totalBreakpointResolveTime += bp->GetResolveTime().count();
163 }
164 }
165 target_metrics_json.try_emplace("breakpoints",
166 std::move(breakpoints_array));
167 target_metrics_json.try_emplace("totalBreakpointResolveTime",
168 totalBreakpointResolveTime);
169
170 if (process_sp) {
171 UnixSignalsSP unix_signals_sp = process_sp->GetUnixSignals();
172 if (unix_signals_sp)
173 target_metrics_json.try_emplace(
174 "signals", unix_signals_sp->GetHitCountStatistics());
175 }
176 }
177
178 // Counting "totalSharedLibraryEventHitCount" from breakpoints of kind
179 // "shared-library-event".
180 {
181 uint32_t shared_library_event_breakpoint_hit_count = 0;
182 // The "shared-library-event" is only found in the internal breakpoint list.
183 BreakpointList &breakpoints = target.GetBreakpointList(/* internal */ true);
184 std::unique_lock<std::recursive_mutex> lock;
185 breakpoints.GetListMutex(lock);
186 size_t num_breakpoints = breakpoints.GetSize();
187 for (size_t i = 0; i < num_breakpoints; i++) {
188 Breakpoint *bp = breakpoints.GetBreakpointAtIndex(i).get();
189 if (strcmp(bp->GetBreakpointKind(), "shared-library-event") == 0)
190 shared_library_event_breakpoint_hit_count += bp->GetHitCount();
191 }
192
193 target_metrics_json.try_emplace("totalSharedLibraryEventHitCount",
194 shared_library_event_breakpoint_hit_count);
195 }
196
197 if (process_sp) {
198 uint32_t stop_id = process_sp->GetStopID();
199 target_metrics_json.try_emplace("stopCount", stop_id);
200
201 llvm::StringRef dyld_plugin_name;
202 if (process_sp->GetDynamicLoader())
203 dyld_plugin_name = process_sp->GetDynamicLoader()->GetPluginName();
204 target_metrics_json.try_emplace("dyldPluginName", dyld_plugin_name);
205 }
206 target_metrics_json.try_emplace("sourceMapDeduceCount",
208 target_metrics_json.try_emplace("sourceRealpathAttemptCount",
210 target_metrics_json.try_emplace("sourceRealpathCompatibleCount",
212 target_metrics_json.try_emplace("summaryProviderStatistics",
214 return target_metrics_json;
215}
216
221 // Report both the normal breakpoint list and the internal breakpoint list.
222 for (int i = 0; i < 2; ++i) {
223 BreakpointList &breakpoints = target.GetBreakpointList(i == 1);
224 std::unique_lock<std::recursive_mutex> lock;
225 breakpoints.GetListMutex(lock);
226 size_t num_breakpoints = breakpoints.GetSize();
227 for (size_t i = 0; i < num_breakpoints; i++) {
228 Breakpoint *bp = breakpoints.GetBreakpointAtIndex(i).get();
229 bp->ResetStatistics();
230 }
231 }
233}
234
236 m_launch_or_attach_time = StatsClock::now();
237 m_first_private_stop_time = std::nullopt;
238}
239
241 // Launching and attaching has many paths depending on if synchronous mode
242 // was used or if we are stopping at the entry point or not. Only set the
243 // first stop time if it hasn't already been set.
245 m_first_private_stop_time = StatsClock::now();
246}
247
249 // Launching and attaching has many paths depending on if synchronous mode
250 // was used or if we are stopping at the entry point or not. Only set the
251 // first stop time if it hasn't already been set.
253 m_first_public_stop_time = StatsClock::now();
254}
255
259
263
267
269
271 std::lock_guard<std::recursive_mutex> guard(
273 const uint64_t num_modules = target != nullptr
274 ? target->GetImages().GetSize()
276 for (size_t image_idx = 0; image_idx < num_modules; ++image_idx) {
277 Module *module = target != nullptr
278 ? target->GetImages().GetModuleAtIndex(image_idx).get()
280 if (module == nullptr)
281 continue;
282 module->ResetStatistics();
283 }
284 if (target)
285 target->ResetStatistics();
286 else {
287 for (const auto &target : debugger.GetTargetList().Targets())
288 target->ResetStatistics();
289 }
290}
291
293 Debugger &debugger, Target *target,
294 const lldb_private::StatisticsOptions &options) {
295
296 const bool summary_only = options.GetSummaryOnly();
297 const bool load_all_debug_info = options.GetLoadAllDebugInfo();
298 const bool include_targets = options.GetIncludeTargets();
299 const bool include_modules = options.GetIncludeModules();
300 const bool include_transcript = options.GetIncludeTranscript();
301 const bool include_plugins = options.GetIncludePlugins();
302
303 json::Array json_targets;
304 json::Array json_modules;
305 StatisticsMap symbol_locator_total_time;
306 double symtab_parse_time = 0.0;
307 double symtab_index_time = 0.0;
308 double debug_parse_time = 0.0;
309 double debug_index_time = 0.0;
310 uint32_t symtabs_loaded = 0;
311 uint32_t symtabs_loaded_from_cache = 0;
312 uint32_t symtabs_saved_to_cache = 0;
313 uint32_t debug_index_loaded = 0;
314 uint32_t debug_index_saved = 0;
315 uint64_t debug_info_size = 0;
316
317 std::lock_guard<std::recursive_mutex> guard(
319 const uint64_t num_modules = target != nullptr
320 ? target->GetImages().GetSize()
322 uint32_t num_debug_info_enabled_modules = 0;
323 uint32_t num_modules_has_debug_info = 0;
324 uint32_t num_modules_with_variable_errors = 0;
325 uint32_t num_modules_with_incomplete_types = 0;
326 uint32_t num_stripped_modules = 0;
327 uint32_t symtab_symbol_count = 0;
328 DWOStats total_dwo_stats;
329 for (size_t image_idx = 0; image_idx < num_modules; ++image_idx) {
330 Module *module = target != nullptr
331 ? target->GetImages().GetModuleAtIndex(image_idx).get()
333 ModuleStats module_stat;
334 module_stat.symtab_parse_time = module->GetSymtabParseTime().get().count();
335 module_stat.symtab_index_time = module->GetSymtabIndexTime().get().count();
336 module_stat.symbol_locator_time = module->GetSymbolLocatorStatistics();
337 symbol_locator_total_time.merge(module_stat.symbol_locator_time);
338 Symtab *symtab = module->GetSymtab(/*can_create=*/false);
339 if (symtab) {
340 module_stat.symtab_symbol_count = symtab->GetNumSymbols();
341 symtab_symbol_count += module_stat.symtab_symbol_count;
342 ++symtabs_loaded;
343 module_stat.symtab_loaded_from_cache = symtab->GetWasLoadedFromCache();
344 if (module_stat.symtab_loaded_from_cache)
345 ++symtabs_loaded_from_cache;
346 module_stat.symtab_saved_to_cache = symtab->GetWasSavedToCache();
347 if (module_stat.symtab_saved_to_cache)
348 ++symtabs_saved_to_cache;
349 }
350 SymbolFile *sym_file = module->GetSymbolFile(/*can_create=*/false);
351 if (sym_file) {
352 if (!summary_only) {
353 if (sym_file->GetObjectFile() != module->GetObjectFile())
354 module_stat.symfile_path =
355 sym_file->GetObjectFile()->GetFileSpec().GetPath();
356 ModuleList symbol_modules = sym_file->GetDebugInfoModules();
357 for (const auto &symbol_module : symbol_modules.Modules())
358 module_stat.symfile_modules.push_back((intptr_t)symbol_module.get());
359 }
360 DWOStats current_dwo_stats = sym_file->GetDwoStats();
361 module_stat.dwo_stats += current_dwo_stats;
362 total_dwo_stats += current_dwo_stats;
366 ++debug_index_loaded;
369 if (module_stat.debug_info_index_saved_to_cache)
370 ++debug_index_saved;
371 module_stat.debug_index_time = sym_file->GetDebugInfoIndexTime().count();
372 module_stat.debug_parse_time = sym_file->GetDebugInfoParseTime().count();
373 module_stat.debug_info_size =
374 sym_file->GetDebugInfoSize(load_all_debug_info);
375 module_stat.symtab_stripped = module->GetObjectFile()->IsStripped();
376 if (module_stat.symtab_stripped)
377 ++num_stripped_modules;
378 module_stat.debug_info_enabled = sym_file->GetLoadDebugInfoEnabled() &&
379 module_stat.debug_info_size > 0;
382 if (module_stat.debug_info_enabled)
383 ++num_debug_info_enabled_modules;
384 if (module_stat.debug_info_size > 0)
385 ++num_modules_has_debug_info;
386 if (module_stat.debug_info_had_variable_errors)
387 ++num_modules_with_variable_errors;
388 }
389 symtab_parse_time += module_stat.symtab_parse_time;
390 symtab_index_time += module_stat.symtab_index_time;
391 debug_parse_time += module_stat.debug_parse_time;
392 debug_index_time += module_stat.debug_index_time;
393 debug_info_size += module_stat.debug_info_size;
394 module->ForEachTypeSystem([&](lldb::TypeSystemSP ts) {
395 if (auto stats = ts->ReportStatistics())
396 module_stat.type_system_stats.insert({ts->GetPluginName(), *stats});
397 if (ts->GetHasForcefullyCompletedTypes())
398 module_stat.debug_info_had_incomplete_types = true;
399 return true;
400 });
401 if (module_stat.debug_info_had_incomplete_types)
402 ++num_modules_with_incomplete_types;
403
404 if (include_modules) {
405 module_stat.identifier = (intptr_t)module;
406 module_stat.path = module->GetFileSpec().GetPath();
407 if (ConstString object_name = module->GetObjectName()) {
408 module_stat.path.append(1, '(');
409 module_stat.path.append(object_name.GetStringRef().str());
410 module_stat.path.append(1, ')');
411 }
412 module_stat.uuid = module->GetUUID().GetAsString();
413 module_stat.triple = module->GetArchitecture().GetTriple().str();
414 json_modules.emplace_back(module_stat.ToJSON());
415 }
416 }
417
418 json::Object global_stats{
419 {"totalSymbolTableParseTime", symtab_parse_time},
420 {"totalSymbolTableIndexTime", symtab_index_time},
421 {"totalSymbolTablesLoaded", symtabs_loaded},
422 {"totalSymbolTablesLoadedFromCache", symtabs_loaded_from_cache},
423 {"totalSymbolTablesSavedToCache", symtabs_saved_to_cache},
424 {"totalDebugInfoParseTime", debug_parse_time},
425 {"totalDebugInfoIndexTime", debug_index_time},
426 {"totalDebugInfoIndexLoadedFromCache", debug_index_loaded},
427 {"totalDebugInfoIndexSavedToCache", debug_index_saved},
428 {"totalDebugInfoByteSize", debug_info_size},
429 {"totalModuleCount", num_modules},
430 {"totalModuleCountHasDebugInfo", num_modules_has_debug_info},
431 {"totalModuleCountWithVariableErrors", num_modules_with_variable_errors},
432 {"totalModuleCountWithIncompleteTypes",
433 num_modules_with_incomplete_types},
434 {"totalDebugInfoEnabled", num_debug_info_enabled_modules},
435 {"totalSymbolTableStripped", num_stripped_modules},
436 {"totalSymbolTableSymbolCount", symtab_symbol_count},
437 {"totalLoadedDwoFileCount", total_dwo_stats.loaded_dwo_file_count},
438 {"totalDwoFileCount", total_dwo_stats.dwo_file_count},
439 {"totalDwoErrorCount", total_dwo_stats.dwo_error_count},
440 };
441
442 if (include_targets) {
443 if (target) {
444 json_targets.emplace_back(target->ReportStatistics(options));
445 } else {
446 for (const auto &target : debugger.GetTargetList().Targets())
447 json_targets.emplace_back(target->ReportStatistics(options));
448 }
449 global_stats.try_emplace("targets", std::move(json_targets));
450 }
451
452 if (!symbol_locator_total_time.map.empty()) {
453 json::Object obj;
454 for (const auto &entry : symbol_locator_total_time.map)
455 obj.try_emplace(entry.first().str(), entry.second);
456 global_stats.try_emplace("totalSymbolLocatorTime", std::move(obj));
457 }
458
459 ConstStringStats const_string_stats;
460 json::Object json_memory{
461 {"strings", const_string_stats.ToJSON()},
462 };
463 global_stats.try_emplace("memory", std::move(json_memory));
464 if (!summary_only) {
465 json::Value cmd_stats = debugger.GetCommandInterpreter().GetStatistics();
466 global_stats.try_emplace("commands", std::move(cmd_stats));
467 }
468
469 if (include_modules) {
470 global_stats.try_emplace("modules", std::move(json_modules));
471 }
472
473 if (include_transcript) {
474 // When transcript is available, add it to the to-be-returned statistics.
475 //
476 // NOTE:
477 // When the statistics is polled by an LLDB command:
478 // - The transcript in the returned statistics *will NOT* contain the
479 // returned statistics itself (otherwise infinite recursion).
480 // - The returned statistics *will* be written to the internal transcript
481 // buffer. It *will* appear in the next statistcs or transcript poll.
482 //
483 // For example, let's say the following commands are run in order:
484 // - "version"
485 // - "statistics dump" <- call it "A"
486 // - "statistics dump" <- call it "B"
487 // The output of "A" will contain the transcript of "version" and
488 // "statistics dump" (A), with the latter having empty output. The output
489 // of B will contain the trascnript of "version", "statistics dump" (A),
490 // "statistics dump" (B), with A's output populated and B's output empty.
491 const StructuredData::Array &transcript =
492 debugger.GetCommandInterpreter().GetTranscript();
493 if (transcript.GetSize() != 0) {
494 std::string buffer;
495 llvm::raw_string_ostream ss(buffer);
496 json::OStream json_os(ss);
497 transcript.Serialize(json_os);
498 if (auto json_transcript = llvm::json::parse(buffer))
499 global_stats.try_emplace("transcript",
500 std::move(json_transcript.get()));
501 }
502 }
503
504 if (include_plugins) {
505 global_stats.try_emplace("plugins", PluginManager::GetJSON());
506 }
507
508 return std::move(global_stats);
509}
510
511llvm::json::Value SummaryStatistics::ToJSON() const {
512 return json::Object{{
513 {"name", GetName()},
514 {"type", GetSummaryKindName()},
515 {"count", GetSummaryCount()},
516 {"totalTime", GetTotalTime()},
517 }};
518}
519
521 std::lock_guard<std::mutex> guard(m_map_mutex);
522 json::Array json_summary_stats;
523 for (const auto &summary_stat : m_summary_stats_map)
524 json_summary_stats.emplace_back(summary_stat.second->ToJSON());
525
526 return json_summary_stats;
527}
528
530 for (const auto &summary_stat : m_summary_stats_map)
531 summary_stat.second->Reset();
532}
static double elapsed(const StatsTimepoint &start, const StatsTimepoint &end)
static void EmplaceSafeString(llvm::json::Object &obj, llvm::StringRef key, const std::string &str)
General Outline: Allows adding and removing breakpoints and find by ID and index.
void GetListMutex(std::unique_lock< std::recursive_mutex > &lock)
Sets the passed in Locker to hold the Breakpoint List mutex.
size_t GetSize() const
Returns the number of elements in this breakpoint list.
lldb::BreakpointSP GetBreakpointAtIndex(size_t i) const
Returns a shared pointer to the breakpoint with index i.
General Outline: A breakpoint has four main parts, a filter, a resolver, the list of breakpoint locat...
Definition Breakpoint.h:81
llvm::json::Value GetStatistics()
Get statistics associated with this breakpoint in JSON format.
const char * GetBreakpointKind() const
Return the "kind" description for a breakpoint.
Definition Breakpoint.h:454
uint32_t GetHitCount() const
Return the current hit count for all locations.
StatsDuration::Duration GetResolveTime() const
Get the time it took to resolve all locations in this breakpoint.
Definition Breakpoint.h:592
A uniqued constant string class.
Definition ConstString.h:40
static void ResetStatistics(Debugger &debugger, Target *target)
Reset metrics associated with one or all targets in a debugger.
static llvm::json::Value ReportStatistics(Debugger &debugger, Target *target, const lldb_private::StatisticsOptions &options)
Get metrics associated with one or all targets in a debugger in JSON format.
A class to manage flag bits.
Definition Debugger.h:80
TargetList & GetTargetList()
Get accessor for the target list.
Definition Debugger.h:193
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
Definition FileSpec.cpp:374
A collection class for Module objects.
Definition ModuleList.h:104
lldb::ModuleSP GetModuleAtIndex(size_t idx) const
Get the module shared pointer for the module at index idx.
ModuleIterable Modules() const
Definition ModuleList.h:537
size_t GetSize() const
Gets the size of the module list.
A class that describes an executable image and its associated object and symbol files.
Definition Module.h:90
virtual ObjectFile * GetObjectFile()
Get the object file representation for the current architecture.
Definition Module.cpp:1177
static Module * GetAllocatedModuleAtIndex(size_t idx)
Definition Module.cpp:124
static std::recursive_mutex & GetAllocationModuleCollectionMutex()
Definition Module.cpp:106
static size_t GetNumberAllocatedModules()
Definition Module.cpp:118
virtual FileSpec & GetFileSpec()
Get accessor to the object file specification.
Definition ObjectFile.h:281
static llvm::json::Object GetJSON(llvm::StringRef pattern="")
A class to count time for plugins.
Definition Statistics.h:94
void merge(StatisticsMap map_to_merge)
Definition Statistics.h:105
std::chrono::duration< double > Duration
Definition Statistics.h:37
void Serialize(llvm::json::OStream &s) const override
llvm::StringMap< SummaryStatisticsSP > m_summary_stats_map
Definition Statistics.h:307
llvm::json::Value ToJSON() const
std::string GetSummaryKindName() const
Definition Statistics.h:249
std::string GetName() const
Definition Statistics.h:240
uint64_t GetSummaryCount() const
Definition Statistics.h:243
Provides public interface for all SymbolFiles.
Definition SymbolFile.h:51
virtual uint64_t GetDebugInfoSize(bool load_all_debug_info=false)=0
Metrics gathering functions.
virtual bool GetDebugInfoIndexWasLoadedFromCache() const =0
Accessors for the bool that indicates if the debug info index was loaded from, or saved to the module...
virtual DWOStats GetDwoStats()
Retrieves statistics about DWO files associated with this symbol file.
Definition SymbolFile.h:501
virtual bool GetDebugInfoIndexWasSavedToCache() const =0
virtual StatsDuration::Duration GetDebugInfoParseTime()
Return the time taken to parse the debug information.
Definition SymbolFile.h:430
virtual bool GetLoadDebugInfoEnabled()
Whether debug info will be loaded or not.
Definition SymbolFile.h:136
virtual bool GetDebugInfoHadFrameVariableErrors() const =0
Accessors for the bool that indicates if there was debug info, but errors stopped variables from bein...
virtual ModuleList GetDebugInfoModules()
Get the additional modules that this symbol file uses to parse debug info.
Definition SymbolFile.h:449
virtual StatsDuration::Duration GetDebugInfoIndexTime()
Return the time it took to index the debug information in the object file.
Definition SymbolFile.h:437
virtual ObjectFile * GetObjectFile()=0
bool GetWasLoadedFromCache() const
Accessors for the bool that indicates if the debug info index was loaded from, or saved to the module...
Definition Symtab.h:228
size_t GetNumSymbols() const
Definition Symtab.cpp:77
bool GetWasSavedToCache() const
Definition Symtab.h:234
TargetIterable Targets()
Definition TargetList.h:193
void Reset(Target &target)
StatsSuccessFail m_frame_var
Definition Statistics.h:335
std::optional< StatsTimepoint > m_launch_or_attach_time
Definition Statistics.h:331
void CollectStats(Target &target)
llvm::json::Value ToJSON(Target &target, const lldb_private::StatisticsOptions &options)
StatsDuration m_create_time
Definition Statistics.h:330
std::optional< StatsTimepoint > m_first_public_stop_time
Definition Statistics.h:333
void IncreaseSourceRealpathAttemptCount(uint32_t count)
uint32_t m_source_realpath_compatible_count
Definition Statistics.h:339
StatsSuccessFail m_expr_eval
Definition Statistics.h:334
std::vector< intptr_t > m_module_identifiers
Definition Statistics.h:336
uint32_t m_source_realpath_attempt_count
Definition Statistics.h:338
void IncreaseSourceRealpathCompatibleCount(uint32_t count)
std::optional< StatsTimepoint > m_first_private_stop_time
Definition Statistics.h:332
BreakpointList & GetBreakpointList(bool internal=false)
Definition Target.cpp:400
lldb_private::SummaryStatisticsCache & GetSummaryStatisticsCache()
Definition Target.cpp:3375
const lldb::ProcessSP & GetProcessSP() const
Definition Target.cpp:306
const ModuleList & GetImages() const
Get accessor for the images for this process.
Definition Target.h:1014
A class that represents a running process on the host machine.
std::chrono::time_point< StatsClock > StatsTimepoint
Definition Statistics.h:30
std::shared_ptr< lldb_private::UnixSignals > UnixSignalsSP
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::Module > ModuleSP
ConstString::MemoryStats stats
Definition Statistics.h:180
llvm::json::Value ToJSON() const
Holds statistics about DWO (Debug With Object) files.
Definition Statistics.h:127
A class that represents statistics for a since lldb_private::Module.
Definition Statistics.h:146
llvm::json::Value ToJSON() const
llvm::StringMap< llvm::json::Value > type_system_stats
Definition Statistics.h:159
StatisticsMap symbol_locator_time
Definition Statistics.h:160
std::vector< intptr_t > symfile_modules
Definition Statistics.h:158
llvm::json::Value ToJSON() const