1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 15:17:36 +00:00

Profiler: Add ability to process read syscalls

Profiler can now process and display read events.
This commit is contained in:
Jakub Berkop 2022-02-12 16:58:01 +01:00 committed by Andreas Kling
parent fae991f599
commit cdfb388154
4 changed files with 28 additions and 1 deletions

View file

@ -369,6 +369,15 @@ ErrorOr<NonnullOwnPtr<Profile>> Profile::load_from_perfcore_file(StringView path
if (it != current_processes.end()) if (it != current_processes.end())
it->value->handle_thread_exit(event.tid, event.serial); it->value->handle_thread_exit(event.tid, event.serial);
continue; continue;
} else if (type_string == "read"sv) {
const auto string_index = perf_event.get("filename_index"sv).to_number<FlatPtr>();
event.data = Event::ReadData {
.fd = perf_event.get("fd"sv).to_number<int>(),
.size = perf_event.get("size"sv).to_number<size_t>(),
.path = profile_strings.get(string_index).value(),
.start_timestamp = perf_event.get("start_timestamp"sv).to_number<size_t>(),
.success = perf_event.get("success"sv).to_bool()
};
} else { } else {
dbgln("Unknown event type '{}'", type_string); dbgln("Unknown event type '{}'", type_string);
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();

View file

@ -221,7 +221,15 @@ public:
pid_t parent_tid {}; pid_t parent_tid {};
}; };
Variant<std::nullptr_t, SampleData, MallocData, FreeData, SignpostData, MmapData, MunmapData, ProcessCreateData, ProcessExecData, ThreadCreateData> data { nullptr }; struct ReadData {
int fd;
size_t size;
String path;
size_t start_timestamp;
bool success;
};
Variant<std::nullptr_t, SampleData, MallocData, FreeData, SignpostData, MmapData, MunmapData, ProcessCreateData, ProcessExecData, ThreadCreateData, ReadData> data { nullptr };
}; };
Vector<Event> const& events() const { return m_events; } Vector<Event> const& events() const { return m_events; }

View file

@ -48,6 +48,8 @@ String SamplesModel::column_name(int column) const
return "Lost Samples"; return "Lost Samples";
case Column::InnermostStackFrame: case Column::InnermostStackFrame:
return "Innermost Frame"; return "Innermost Frame";
case Column::Path:
return "Path";
default: default:
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
@ -89,6 +91,13 @@ GUI::Variant SamplesModel::data(GUI::ModelIndex const& index, GUI::ModelRole rol
if (index.column() == Column::InnermostStackFrame) { if (index.column() == Column::InnermostStackFrame) {
return event.frames.last().symbol; return event.frames.last().symbol;
} }
if (index.column() == Column::Path) {
if (!event.data.has<Profile::Event::ReadData>())
return "";
return event.data.get<Profile::Event::ReadData>().path;
}
return {}; return {};
} }
return {}; return {};

View file

@ -27,6 +27,7 @@ public:
ExecutableName, ExecutableName,
LostSamples, LostSamples,
InnermostStackFrame, InnermostStackFrame,
Path,
__Count __Count
}; };