Releases: google/perfetto
Perfetto v52.0
We’re excited to share some highlights from the Perfetto v52 release.
🌙 Dark mode support
The Perfetto UI now features a dark mode with theme-aware colors!
Dark mode can be enabled via"settings" in the left-hand menu: switch the “[Experimental] UI Theme” option to “Dark”.
Note: this feature is still undergoing polish so is marked as experimental. Please file bugs for any readability/accessibility issues you may encounter!
🎛️ Advanced TrackEvent control & visualization
SDK users and developers converting external traces to Perfetto format now have fine-grained control over track display and merging behavior. The new sibling_merge_behavior and sibling_merge_key options in TrackDescriptor allow you to:
- Force tracks with the same name to be displayed separately
- Merge tracks with different names into a single UI track
- Override the default name-based merging logic
Additionally, counter tracks can now share Y-axis ranges using the y_axis_share_key in CounterDescriptor, making it easier to compare related metrics with the same units.
Learn more about converting custom data to Perfetto format and more advanced conversion features.
🤖 UI automation: macros & startup commands
Perfetto UI now supports two new features to improve developer productivity:
- Startup commands to automatically configure the analysis environment when traces load
- Macros to add commands built out of other UI commands to the Command Palette
Both features can be found in the UI settings page:
Learn more about UI startup commands and macros and configuring startup commands via URL parameters.
📊 Easily turn kernel trace points into slices and counters
Perfetto now automatically creates structured track visualizations for Linux kernel ftrace events that follow established naming conventions. This feature enables kernel developers to instrument their code with ftrace tracepoints and see them as slices and counters in the Perfetto UI without modifying Perfetto's source code.
Learn more about creating kernel track events with ftrace.
⚡ Trace processor performance & new features
- Faster trace loading: Optimized data structures and MurmurHash implementation result in faster trace loading and query execution
- New analysis tools: The
slice_self_durtable provides self-duration calculations, while theregexp_extractfunction allows parsing data out of strings without complex use of INSTR/SUBSTR - Expanded format support: Added symbolization for kernel frames in Linux perf.data files and support for trace-cmd report output format
📱 Enhanced Android analysis capabilities
- Better ANR debugging: The
anr_typecolumn in the android_anrs table provides more detailed ANR classification - Bitmap tracking: New
android.bitmapsmodule offers timeseries information about bitmap usage - CPU performance insights: Enhanced CPU utilization functions with upid/utid parameters and improved frequency calculations
🎨 General UI improvements & performance
- Bulk track management: Configure multiple tracks simultaneously, saving time when setting up complex analysis views
- Improved plugin architecture: Better isolation and standardized command naming
- Enhanced visualization: Better DataGrid implementation with improved aggregation performance
- Track guidance: New help infrastructure and descriptive text support for better user onboarding
- Optimized track merging: Faster performance when working with large numbers of track_event tracks
📊 Recording & data source improvements
- Enhanced recording UI: Improved recording page with dedicated Perfetto SDK section for configuring track_event data source categories and wildcards
- Advanced ftrace features: Support for exclusive single-tenant features, tracing_cpumask, tracefs options, and TID-based filtering
- GPU monitoring: New support for polling Adreno GPU frequency data
🔧 Additional improvements
- Fixed numerous crashes and performance issues throughout the UI
- Improved WebUSB error messages for better debugging experience
- Enhanced support for persisting state from traces loaded through postMessage
For complete details, see the changelog or view all changes on GitHub.
Download Perfetto v52.0 from our releases page, get started at docs.perfetto.dev, or try the UI directly at ui.perfetto.dev.
Perfetto v51.2
v51.2 - 2025-07-03:
Trace Processor:
* Fixed issue with trace summarization crashing with released trace
processor prebuilt. Builds from source with GN and default configuration
is unaffected.
Perfetto v51.1
v51.1 - 2025-06-26:
Build system:
* Fixed issue with Bazel copts/cxxopts. Embedders are required to add a
default_cxxopts to their perfetto.bzl file in their repository.
v51.0 - 2025-06-24:
Tracing service and probes:
* Added a new data source to poll for CPU time per UID and cluster.
SQL Standard library:
* Added a new standard library table for filtering IRQ slices.
* Added a new standard library module for Android's Low Memory Killer.
Trace Processor:
* Reworked core database engine to be more performant and better architected
for future imporvements.
* Added new "trace summarization" functionality to trace processor as a more
flexible replacement to old metrics system.
* Added support for executing all available metrics when summarizing the
trace with `--summary-metrics-v2 all`.
* Added `trace_summary()` function to the Python API to execute the
trace summaries and, specifically, v2 metrics.
* Added support to adding SQL packages to Python API. This is the
counterpart to the `--add-sql-package` shell option and allow loading SQL
packages and modules from a filesystem path. These are then available to
load using `INCLUDE PERFETTO MODULE` PerfettoSQL statements.
* Improved handling of traces containing overlapping "complete" events
(i.e. events with a duration, AKA 'X' events in the JSON format).
While overlapping events are prohibited by the JSON spec, they do
appear in many synthetically generated JSON traces. Previously, such
events would break the data model of trace processor and cause signifcant
glitches in the UI. These events are now dropped, fixing all the visual
glitches and an error stat is emitted to make the user aware.
* Improved performance of parsing JSON by 7x. JSON traces should now load
much faster in the Perfetto UI and the trace processor.
UI:
* Improved JSON loading performance. See `Trace Processor` section above.
* Improved duration based slice aggregators - slices are now trimmed to the
width of the area selection.
* Added the ability for users to set a custom timezone in the UI.
* Added the ability to add descriptive text to tracks.
* Added touchscreen support. The UI can now be used from tablets and other
touch devices.
* Removed the Viz page; it was an experiment which did not go anywhere.
SDK:
* Changed the implementation of TrackEvent to only have a single data source
for multiple namespace; categories will be exported correctly only on
recent perfetto tracing services that support UpdateDataSource.
* Changed the priority of TrackEvent enabled/disabled category and tags.
The new logic ranks (in this order)
specific > pattern > single char "*" wildcard,
categories (enabled > disabled) > tags (disabled > enabled).
Docs:
* Signifcantly improved the project's documentation with a team-wide
collaboration to make it more user-friendly and up to date.
Perfetto v50.1
v50.1 - 2025-04-17:
Trace Processor:
* Fix build on windows
v50.0 - 2025-04-17:
Tracing service and probes:
* Removed mm_events support as it is no longer maintained.
SQL Standard library:
*
Trace Processor:
* Added `thread_or_process_slice` to the `slices.with_context` module for
a unified table which contains all thread and process slices in the trace.
This is often useful for ad-hoc queries on Android or Linux traces.
* Removed `slices.slices` module and `_slice_with_thread_and_process_info`
view. This is replaced by `thread_or_process_slice` (see above).
* Fixed io_wait arg name conversion in traceconv.
UI:
* Added basic syntax highlighting support to the query page.
* Retain DOM state between page changes - this fixes a bug where the scroll
position is lost when switching between pages.
* Added a plugin-able settings page - a place to put user-facing.
configuration options which are more complex than a simple boolean. Flags
should still be used for experimental features and feature flags.
* Added paging to query results and remove arbitrary 10,000 row limit. This
fixes a bug where selecting too many slices (e.g. `select * from slice`)
can tank UI performance.
* Added options to bulk-copy tracks to a new workspace.
* Allow workspace tracks to be reordered (drag-n-drop).
* Render slice hover tooltips to the DOM instead of canvas, which allows
them to be larger and more customizable.
* Add subsystem to pass URL args directly to plugins.
* Added plugin-able track filters, including filter by process and thread.
* Make android logs selectable, add hover-tooltips, and allow them to be
selected when iterating search results.
* Add flag to work around hotkey collisions on dvorak.
* Fix bug in search where search results could not be iterated through.
* Fix bug where to "go to next slice" hotkey was not working on AZERTY.
* Fix bug where created pivoted debug tracks would sometimes be very slow.
* Fix bug where tracks can get hidden behind sticky headers.
* Fix crash when marking DNF slices.
* Fix bug where viewer page didn't scroll back up to the top of the track
group when a group is collapsed.
* Small consistency tweaks to styling.
* Stretch overview timeline to fill screen horizontally to avoid superfluous
whitespace.
SDK:
* Added `TraceWriter::drop_count` function for determining the number of
of times the writer started dropping data due to exhaustion of the shared
memory buffer. This can be used by SDK users to diff this value and
reemit interned data if necessary.
Perfetto v49.0
v49.0 - 2025-01-06:
Tracing service and probes:
* Add `--clone-by-name` to the perfetto command line. This allows cloning a
tracing session by its unique_session_name.
* Fixed a bug that would delay the trace start acknowledgement, resulting
in a 30s when using --background-wait, if an Android producer process is
frozen, as it would be considered unresponsive.
* Added basic support for kprobes with ftrace.
SQL Standard library:
* Removed the `type` column from all non-track tables. Please see
https://perfetto.dev/docs/analysis/perfetto-sql-backcompat#change-in-semantic-of-code-type-code-column-on-track-tables
for more information.
* Changed the semantic of `type` column from all track tables. Please see
https://perfetto.dev/docs/analysis/perfetto-sql-backcompat#removal-of-code-type-code-column-from-all-non-track-tables
for more information.
* Removed the `linux_device_track` table. Linux RPM (runtime power
management) tracks formerly in this table now can be found in the `track`
table with `type` `linux_rpm`.
* Removed the `energy_counter_track` table. Android energy estimate
breakdown tracks formerly in this table now can be found in the `track`
table with `type` `android_energy_estimation_breakdown`.
* Removed the `energy_per_uid_counter_track` table. Android energy estimate
breakdown tracks formerly in this table now can be found in the `track`
table with `type` `android_energy_estimation_breakdown_per_uid`.
* Moved the `gpu_work_period_track` table into the `android.gpu.work_period`
standard library module and renamed it to `android_gpu_work_period_track`.
* Removed the `irq_counter_track` table. Irq counter tracks formerly in this
table now can be found in the `track` table with `type`
`irq_counter`.
* Removed the `softirq_counter_track` table. Softirq counter tracks formerly
in this table now can be found in the `track` table with `type`
`softirq_counter`.
* Removed the `uid_counter_track` table. It was redundant as no data was
inserted directly into it.
* Removed the `uid_track` table. It was redundant as no data was
inserted directly into it.
* Removed `common` package. It has been deprecated since `v42` and most
functionality has been moved into other packages. Notably, the time
conversion functions can be found in `time.conversion` module, and
`thread_slice` is available with `slices.with_context`.
* Deprecated UINT and INT integer types in Perfetto SQL. Please use LONG in
Perfetto SQL schema.
* Deprecated FLOAT flating type in Perfetto SQL. Please use DOUBLE in
Perfetto SQL schema.
* Added TIMESTAMP, DURATION, ID and JOINID types to Perfetto SQL schema.
TIMESTAMP and DURATION refers to time columns in nanoseconds. ID column
is a primary key for the column and JOINID is referencing ID
column of other table.
* Removed the `experimental_sched_upid` table. Prefer the joining `sched`
and `thread` tables directly instead.
* Removed the experimental_counter_dur table. Prefer using the
`counter_leading_intervals` macro from the `counters.intervals` standard
library module.
UI:
* Introduced `Open table:` command which would open any Perfetto Standard
Library table in a new tab.
* Various improvements to timeline rendering performance.
* Added workspace switcher and menu to move tracks between workspaces.
* Completely overhauled recording page.
* Improved area selection UX.
* Improved fuzzy search.
* Hide 'Open with legacy UI' by default.
SDK:
* Added `NamedTrack`, it allows creating arbitrarily named tracks.
Perfetto v48.1
v48.1 - 2024-10-14:
SDK:
* Fix build with MSVC.
Perfetto v48.0
v48.0 - 2024-10-11:
Tracing service and probes:
* Improved accuracy of ftrace event cropping when there are multiple
concurrent tracing sessions. See `previous_bundle_end_timestamp` in
ftrace_event_bundle.proto.
* Increased watchdog timeout to 180s from 30s to make watchdog crashes
much less likely when system is under heavy load.
SQL Standard library:
* Improved CPU cycles calculation in `linux.cpu.utilization` modules:
`process`, `system` and `thread` by fixing a bug responsible for too high
CPU cycles values.
* Introduces functions responsible for calculating CPU cycles with
breakdown by CPU, thread, process and slice for a given interval.
* Added `linux.perf.samples` module for easy querying of perf samples
in traces.
* Added `stacks.cpu_profiling` module for easy querying of all CPU
profiling data in traces.
Trace Processor:
* Added (partial) support for the Gecko (Firefox) JSON profiler format.
Parsing is optimized for CPU profiling collected with `perf` and converted
to the Gecko format. Only parsing of samples is supported; parsing of
markers and any other features (e.g. colours) is *not* supported.
* Added (partial) suppoort for the perf script text format from both perf
and simpleperf. Only parsing files with the default formating or with pids
included (i.e. `-F +pid`) is supported. Any other formatting options are
*not* supported.
* Added support for parsing non-streaming ART method tracing format.
* Added support for parsing GZIP files with multiple gzip streams.
* Added support for parsing V8 CPU profling samples from proto traces.
* Renamed Trace Processor's C++ method `RegisterSqlModule()` to
`RegisterSqlPackage()`, which better represents the module/package
relationship. Package is the top level grouping of modules, which are
objects being included with `INCLUDE PERFETTO MODULE`.
`RegisterSqlModule()` is still available and runs `RegisterSqlPackage()`.
`RegisterSqlModule()` will be deprecated in v50.0.
UI:
* Scheduling wakeup information now reflects whether the wakeup came
from an interrupt context. The per-cpu scheduling tracks now show only
non-interrupt wakeups, while the per-thread thread state tracks either
link to an exact waker slice or state that the wakeup is from an
interrupt. Older traces that are recorded without interrupt context
information treat all wakeups as non-interrupt.
* Nest global/user async tracks according to their parent/child relationship
in the trace.
* Introduced new workspace API which allows nested tracks & multiple
workspace support.
* Introduced middle ellipsis in track titles when title text is longer than
the available space, while preserving the start and end of title text &
add popup of full title text on hover.
* Fixed spurious judder issue in popups with tall content.
* Fixed bug where marker durations were not rendered on selected markers.
* Removed ChromeScrollJank V1 track (V2 should be used from now on).
* Major internal changes (affecting pugin developers and core contributors):
* Removed legacy selection types, use track event selection types going
forward for all single event selections.
* Details panels are now attached to the track rather than registered
separately.
* Introduced `registerSqlSelectionResolver`, which allow plugins to add
handlers allowing other parts of the codebase to make selection on
tracks from other plugins based on a sql table name and id.
* Changed lifetime of track instances; they are now created on trace load
by plugins and survive the lifetime of the trace, rather than getting
created and destroyed as they appear/disappear on the timeline.
* Fix circular dependencies and turn future instances into errors.
Perfetto v47.0
v47.0 - 2024-08-07:
SQL Standard library:
* Removed `cpu.cpus` and `cpu.size` modules. The functions inside
for guessing core type were inaccurate and often misleading.
There is no replacement for these as there is no accurate data
source available.
* Moved `cpu.utilization` package to `linux.cpu.utilization`. The
functionality inside this package only works properly on Linux
and Linux derived OSes (e.g. Android).
* Moved `cpu.freq` module to `linux.cpu.frequency` and renamed
`cpu_freq_counters` to `cpu_frequency_counters` for the same
reason as above.
* Moved `gpu.frequency` to `android.gpu.frequency` for the same reason as
above.
* Moved `cpu.idle` module to `linux.cpu.idle` or `linux.cpu.idle_stats` for
the same reason as above.
* Moved content of `linux.cpu_idle` into `linux.cpu.idle` and
`linux.cpu.idle_stats` to make it consistent with above changes.
* Moved `memory.android.gpu` to `android.memory.gpu` to make it consistent
with above changes.`
* Moved contents of `memory.linux.process` to `linux.memory.process` and
`android.memory.process` to make it consistent with above changes.
* Moved `memory.linux.high_watermark` to `linux.memory.high_watermark` to
make it consistent with above changes.
* Moved `memory.heap_graph_dominator_tree` to
`android.memory.heap_graph.dominator_tree`. This is to allow for the
addition of more modules related to heap graphs.
* Added `linux_kernel_threads` table to `linux.threads` module.
Trace Processor:
* Change `NotifyEndOfFile` method to return a Status object. For backwards
compatibility, this value can be ignored but in the future a [[nodiscard]]
annotation will be added.
* Added `CREATE PERFETTO INDEX` to add sqlite-like indexes to Perfetto
tables. Has the same API as `CREATE INDEX`.
UI:
* Updated to Typescript 5.5.2, lib es2022, & upreved various packages.
* Made `Disposable`, `DisposableStack`, and their async variants available
to use in the UI.
* Vastly improved flamegraph.
* Added track filter which can be used to search for tracks by name.
* Added Wattson cpu power estimation plugin.
* Added option to show thread slice ancestor/descendant slices in thread
slice details panel context menu.
* Added feature where plugin can ask tracks to be automatically pinned when
adding tracks on trace load.
* Fixed inconsistent y-range for all CPU SS tracks.
* Switched to using explicit de/serialization when creating/loading
permalinks.
* Improved sched slice details query efficiency.
* Added `TagInput` widget.
* Added `ui/format-sources` script to run eslint and prettier in one go.
* Reduced number of circular imports.
* Added `SharedAsyncDisposable` for management of shared async resources.
* Fixed rendering of negative counter tracks.
* Improved data loss notification using a popup
* Tidied up `TrackDescriptor`.
* Added Android trace probes for ChromeOS
* Added feature to try reconnect when websocket connection is lost.
* Fixed bug in 1ns event rendering.
* Tidied up details panel font sizes and weights.
* Added segmented buttons widget.
* Added 'main thread' chip to main thread tracks.
* Added plugin API to add menu items to the sidebar.
* Added `onTraceReady` plugin hook.
* Various clean-ups and bugfixes.
Perfetto v46.0
v46.0 - 2024-06-13:
SQL Standard library:
* Added megacycles support to CPU package. Added tables:
`cpu_cycles_per_process`, `cpu_cycles_per_thread` and
`cpu_cycles_per_cpu`.
* Improved `memory` package. Added `memory.linux.process`,
`memory.linux.high_watermark` and `memory.android.gpu` modules.
* Created `gpu` package with `gpu.frequency` module.
* Migrated `sched.utilization` package to `cpu.utilization`.
Trace Processor:
* Added "time to initial display" and "time to full display" metrics to
the Android startup metric.
UI:
* Added plugin for synchronizing two instances of the UI - search for
'Enable timeline sync with other Perfetto UI tabs' in the command palette.
* Add builtin prompt functionality to the plugin API:
I.e. `await PluginContextTrace.prompt('...')`
* Fixed various bits of tech debt.
SDK:
* The TRACE_COUNTER macro and CounterTrack constructor no longer accept
`const char *` track names. In case your code fails to compile,
https://perfetto.dev/docs/instrumentation/track-events#dynamic-event-names
explains how to fix the problem.
Perfetto v45.0
v45.0 - 2024-05-09:
Trace Processor:
* Optimised single column `DISTINCT` queries.
* Optimised `LIMIT` and `OFFSET` queries.
SQL Standard library:
* Improved support for querying startups on Android 9 (API level 28) and
below. Available in `android.startup.startups` module.
* Added tables for querying "Time To Initial Display" and "Time To Full
Display" metrics for app startups. Available in new module
`android.startup.time_to_display`.
* Added table for querying hardware power rail counters in new
`android.power_rails` module.
UI:
* Add tracks to the list of searchable items.
* Use mipmaps to improve track query performance on large traces.
* Fix slow scrolling bug in ftrace explorer tab on low DPI machines.
* Overhaul track decider queries to improve trace load times.
* Add track
* Tidy up command names & remove some example ones.
* Remove arg auto-completion in pivot table.
* Show dominator tree views by default.
* Fix counter event selection off-by-one error.
* Add viewport control to the plugin API.
* Sticky track titles to improve track button accessibility in tall tracks.
* A handful of small bugfixes.
SDK:
* The TRACE_EVENT macro used to reject `const char *` event names: either
`StaticString` or `DynamicString` needed to be specified. In the last year
(since https://r.android.com/2494614), TRACE_EVENT mistakenly accepted
`const char *` as an event name. This has been fixed now. In case your
code fails to compile,
https://perfetto.dev/docs/instrumentation/track-events#dynamic-event-names
explains how to fix the problem.