summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibSymbolication
diff options
context:
space:
mode:
authorGunnar Beutner <gbeutner@serenityos.org>2021-06-19 13:21:04 +0200
committerAndreas Kling <kling@serenityos.org>2021-06-19 22:04:19 +0200
commita6ba05b02b7e89102b3e724d48ae88fa38698334 (patch)
tree534c8b4c2b2034492993d5b4e85b4b793fceb739 /Userland/Libraries/LibSymbolication
parentc31392510aa21d3ce5000f19a12dcf43abf9613d (diff)
downloadserenity-a6ba05b02b7e89102b3e724d48ae88fa38698334.zip
LibSymbolication+Utilities: Show inlined functions for bt
Diffstat (limited to 'Userland/Libraries/LibSymbolication')
-rw-r--r--Userland/Libraries/LibSymbolication/Symbolication.cpp24
-rw-r--r--Userland/Libraries/LibSymbolication/Symbolication.h4
2 files changed, 17 insertions, 11 deletions
diff --git a/Userland/Libraries/LibSymbolication/Symbolication.cpp b/Userland/Libraries/LibSymbolication/Symbolication.cpp
index 9964684364..c331e568d1 100644
--- a/Userland/Libraries/LibSymbolication/Symbolication.cpp
+++ b/Userland/Libraries/LibSymbolication/Symbolication.cpp
@@ -49,20 +49,23 @@ Optional<Symbol> symbolicate(String const& path, u32 address)
u32 offset = 0;
auto symbol = cached_elf->debug_info->elf().symbolicate(address, &offset);
- auto source_position = cached_elf->debug_info->get_source_position(address);
- String filename;
- u32 line_number = 0;
- if (source_position.has_value()) {
- filename = source_position.value().file_path;
- line_number = source_position.value().line_number;
+ 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 (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 {
.address = address,
.name = move(symbol),
.offset = offset,
- .filename = move(filename),
- .line_number = line_number
+ .source_positions = move(positions),
};
}
@@ -166,10 +169,13 @@ Vector<Symbol> symbolicate_thread(pid_t pid, pid_t tid)
else
adjusted_address = address;
- auto result = symbolicate(found_region->path, adjusted_address);
+ // We're subtracting 1 from the address because this is the return address,
+ // i.e. it is one instruction past the call instruction.
+ auto result = symbolicate(found_region->path, adjusted_address - 1);
if (!result.has_value()) {
symbols.append(Symbol {
.address = address,
+ .source_positions = {},
});
continue;
}
diff --git a/Userland/Libraries/LibSymbolication/Symbolication.h b/Userland/Libraries/LibSymbolication/Symbolication.h
index f969de48a4..346dedd3a2 100644
--- a/Userland/Libraries/LibSymbolication/Symbolication.h
+++ b/Userland/Libraries/LibSymbolication/Symbolication.h
@@ -7,6 +7,7 @@
#pragma once
#include <AK/String.h>
+#include <LibDebug/DebugInfo.h>
namespace Symbolication {
@@ -14,8 +15,7 @@ struct Symbol {
FlatPtr address { 0 };
String name {};
u32 offset { 0 };
- String filename {};
- u32 line_number { 0 };
+ Vector<Debug::DebugInfo::SourcePosition> source_positions;
};
Vector<Symbol> symbolicate_thread(pid_t pid, pid_t tid);