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:
parent
fae991f599
commit
cdfb388154
4 changed files with 28 additions and 1 deletions
|
@ -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();
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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 {};
|
||||||
|
|
|
@ -27,6 +27,7 @@ public:
|
||||||
ExecutableName,
|
ExecutableName,
|
||||||
LostSamples,
|
LostSamples,
|
||||||
InnermostStackFrame,
|
InnermostStackFrame,
|
||||||
|
Path,
|
||||||
__Count
|
__Count
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue