diff --git a/Userland/DevTools/Profiler/Profile.cpp b/Userland/DevTools/Profiler/Profile.cpp index b1bffb4529af06..1502e550fb8462 100644 --- a/Userland/DevTools/Profiler/Profile.cpp +++ b/Userland/DevTools/Profiler/Profile.cpp @@ -369,6 +369,15 @@ ErrorOr> Profile::load_from_perfcore_file(StringView path if (it != current_processes.end()) it->value->handle_thread_exit(event.tid, event.serial); continue; + } else if (type_string == "read"sv) { + const auto string_index = perf_event.get("filename_index"sv).to_number(); + event.data = Event::ReadData { + .fd = perf_event.get("fd"sv).to_number(), + .size = perf_event.get("size"sv).to_number(), + .path = profile_strings.get(string_index).value(), + .start_timestamp = perf_event.get("start_timestamp"sv).to_number(), + .success = perf_event.get("success"sv).to_bool() + }; } else { dbgln("Unknown event type '{}'", type_string); VERIFY_NOT_REACHED(); diff --git a/Userland/DevTools/Profiler/Profile.h b/Userland/DevTools/Profiler/Profile.h index 15fff19f59cd53..2881b8201f334e 100644 --- a/Userland/DevTools/Profiler/Profile.h +++ b/Userland/DevTools/Profiler/Profile.h @@ -221,7 +221,15 @@ class Profile { pid_t parent_tid {}; }; - Variant data { nullptr }; + struct ReadData { + int fd; + size_t size; + String path; + size_t start_timestamp; + bool success; + }; + + Variant data { nullptr }; }; Vector const& events() const { return m_events; } diff --git a/Userland/DevTools/Profiler/SamplesModel.cpp b/Userland/DevTools/Profiler/SamplesModel.cpp index 7f0890e087bde0..e9123af0a6f8a2 100644 --- a/Userland/DevTools/Profiler/SamplesModel.cpp +++ b/Userland/DevTools/Profiler/SamplesModel.cpp @@ -48,6 +48,8 @@ String SamplesModel::column_name(int column) const return "Lost Samples"; case Column::InnermostStackFrame: return "Innermost Frame"; + case Column::Path: + return "Path"; default: VERIFY_NOT_REACHED(); } @@ -89,6 +91,13 @@ GUI::Variant SamplesModel::data(GUI::ModelIndex const& index, GUI::ModelRole rol if (index.column() == Column::InnermostStackFrame) { return event.frames.last().symbol; } + + if (index.column() == Column::Path) { + if (!event.data.has()) + return ""; + return event.data.get().path; + } + return {}; } return {}; diff --git a/Userland/DevTools/Profiler/SamplesModel.h b/Userland/DevTools/Profiler/SamplesModel.h index f40702cb3174f4..06079a90888098 100644 --- a/Userland/DevTools/Profiler/SamplesModel.h +++ b/Userland/DevTools/Profiler/SamplesModel.h @@ -27,6 +27,7 @@ class SamplesModel final : public GUI::Model { ExecutableName, LostSamples, InnermostStackFrame, + Path, __Count };