summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibSymbolication
diff options
context:
space:
mode:
authorRodrigo Tobar <rtobarc@gmail.com>2021-10-14 21:36:22 +0800
committerBrian Gianforcaro <b.gianfo@gmail.com>2021-10-17 22:07:10 -0700
commit08428aadad19b01f3d3b5a9f8c2247fc5ed50aea (patch)
tree2747c1f5d3b2cd5ee008f23bbf0bdbbb2701d844 /Userland/Libraries/LibSymbolication
parent85a28a65550ff76fd7c352fccb7b76f576cff33f (diff)
downloadserenity-08428aadad19b01f3d3b5a9f8c2247fc5ed50aea.zip
LibSymbolication: Skip source position calculation if requested
Calculating source code positions can be expensive, and some applications (like SystemMonitor's Stack tab) don't even show this information, making these calculations wasteful. This commit adds a new enumerated flag to the `symbolicate` functions for callers to specify whether source positions should be included in the results; it defaults to "Yes" to preserve old behavior for existing applications.
Diffstat (limited to 'Userland/Libraries/LibSymbolication')
-rw-r--r--Userland/Libraries/LibSymbolication/Symbolication.cpp23
-rw-r--r--Userland/Libraries/LibSymbolication/Symbolication.h9
2 files changed, 20 insertions, 12 deletions
diff --git a/Userland/Libraries/LibSymbolication/Symbolication.cpp b/Userland/Libraries/LibSymbolication/Symbolication.cpp
index 50f78acb52..ef88304429 100644
--- a/Userland/Libraries/LibSymbolication/Symbolication.cpp
+++ b/Userland/Libraries/LibSymbolication/Symbolication.cpp
@@ -61,7 +61,7 @@ Optional<FlatPtr> kernel_base()
return s_kernel_base;
}
-Optional<Symbol> symbolicate(String const& path, FlatPtr address)
+Optional<Symbol> symbolicate(String const& path, FlatPtr address, IncludeSourcePosition include_source_positions)
{
String full_path = path;
if (!path.starts_with('/')) {
@@ -106,16 +106,19 @@ Optional<Symbol> symbolicate(String const& path, FlatPtr address)
u32 offset = 0;
auto symbol = cached_elf->debug_info->elf().symbolicate(address, &offset);
- auto source_position_with_inlines = cached_elf->debug_info->get_source_position_with_inlines(address);
Vector<Debug::DebugInfo::SourcePosition> positions;
- for (auto& position : source_position_with_inlines.inline_chain) {
- if (!positions.contains_slow(position))
- positions.append(position);
- }
+ if (include_source_positions == IncludeSourcePosition::Yes) {
+ auto source_position_with_inlines = cached_elf->debug_info->get_source_position_with_inlines(address);
+
+ for (auto& position : source_position_with_inlines.inline_chain) {
+ if (!positions.contains_slow(position))
+ positions.append(position);
+ }
- if (source_position_with_inlines.source_position.has_value() && !positions.contains_slow(source_position_with_inlines.source_position.value())) {
- positions.insert(0, source_position_with_inlines.source_position.value());
+ if (source_position_with_inlines.source_position.has_value() && !positions.contains_slow(source_position_with_inlines.source_position.value())) {
+ positions.insert(0, source_position_with_inlines.source_position.value());
+ }
}
return Symbol {
@@ -127,7 +130,7 @@ Optional<Symbol> symbolicate(String const& path, FlatPtr address)
};
}
-Vector<Symbol> symbolicate_thread(pid_t pid, pid_t tid)
+Vector<Symbol> symbolicate_thread(pid_t pid, pid_t tid, IncludeSourcePosition include_source_positions)
{
struct RegionWithSymbols {
FlatPtr base { 0 };
@@ -245,7 +248,7 @@ Vector<Symbol> symbolicate_thread(pid_t pid, pid_t tid)
// However, because the first frame represents the current
// instruction pointer rather than the return address we don't
// subtract 1 for that.
- auto result = symbolicate(found_region->path, adjusted_address - (first_frame ? 0 : 1));
+ auto result = symbolicate(found_region->path, adjusted_address - (first_frame ? 0 : 1), include_source_positions);
first_frame = false;
if (!result.has_value()) {
symbols.append(Symbol {
diff --git a/Userland/Libraries/LibSymbolication/Symbolication.h b/Userland/Libraries/LibSymbolication/Symbolication.h
index 7b5535c4f5..b52af72487 100644
--- a/Userland/Libraries/LibSymbolication/Symbolication.h
+++ b/Userland/Libraries/LibSymbolication/Symbolication.h
@@ -20,8 +20,13 @@ struct Symbol {
bool operator==(Symbol const&) const = default;
};
+enum class IncludeSourcePosition {
+ Yes,
+ No
+};
+
Optional<FlatPtr> kernel_base();
-Vector<Symbol> symbolicate_thread(pid_t pid, pid_t tid);
-Optional<Symbol> symbolicate(String const& path, FlatPtr address);
+Vector<Symbol> symbolicate_thread(pid_t pid, pid_t tid, IncludeSourcePosition = IncludeSourcePosition::Yes);
+Optional<Symbol> symbolicate(String const& path, FlatPtr address, IncludeSourcePosition = IncludeSourcePosition::Yes);
}