* Build tables to test & get code coverage for table generation used by UI. Get all data to test for issues seen with projectors vs certain data. Increases Perfetto CC from 32% to 83%
* Fix LTTng tables not implementing IsDataAvailable(). Increase LTTng code coverage from 56% -> 61% by covering table & data projectors
* Bring GUI Table Process support with arg fields & process label from Chromium.
* Enhance GenericEvents to show this process label info if available.
* Add Android Package table
* Add rowcount logging for Perfetto sql queries.
* Slightly better Unit Tests for new tables by building tables as well (data not processed yet)
* Add wake info in scheduling table.
* Address feedback comments.
* Address feedback comments 2.
* Add launchSetting.json in .gitignore.
* Update thread name in unit test.
* First check-in of initial CPU sampling verifying we get some basic data with sample & proc/thread.
* Upgrade all NuGet deps including Performance.SDK to 0.109.24 (fix breaking changes). Add trace processor shell logging to Perfetto UT
* Walk the stack and produce StackWalk Module!Function array as well as Instruction Pointer (IP) Module & Function
* Add some Unit Tests for CPU Sampling and a small Android 12 trace with CPU Sampling
Made some memory optimizations to help improve the sluggishness in WPA when viewing large traces. Memory optimizations reduce memory usage by about 50%. UI is more responsive now. Optimizations include
Used string interning on the high-count string fields
Switched the variable length argument fields from List to string[]
Changed bunch of longs to ints. These are mostly ID fields. Confirmed they are int or smaller within Perfetto
Table renaming
Removed redundant "Perfetto" from all tables and column config names
Added column configs that graph by StartTime instead of duration for GenericEvents
Added fix for duplicate GUIDs
* Add ParentTree to GenericEvents and provide new non-default Hierarchical / Stack view of this named "Perfetto Trace Events - Process-Thread-ParentNameTree"
Add tracking of parent depth level in order to show parent/child relationships and more closely match Perfetto UI. Also fix various scalar data types that can come across as optional / nullable.
A type of Generic Events were being excluded from the previous generic event query. Generic events can come with a thread and a process, or just with a process. We were missing out on the latter. Added a query for the process_track table which allows us to query events that only have a process. Modified the giant LINQ query to use LEFT OUTER JOIN syntax because there are 2 valid paths now.
Added a table config to better view process-only Generic Events and also a table config that shows Generic Event activity.
Unit tests needed to be updated because the output changed slightly
Added table that displays memory for each process based on /proc//status
Added table that displays overall system memory based on /proc/meminfo
Reorganized table groups into "Perfetto - Android", "Perfetto - Events", and "Perfetto - System"
Reorganized namespaces and PerfettoPluginConstants
A few small changes before I merge the Perfetto branch into develop.
Changed path for Perfetto plugin in build pipeline
Updated main README to include Perfetto information
Restructured and added more Perfetto unit tests
This PR adds a plugin for displaying generic events from Perfetto traces. Added a new "PerfettoCds" project to the solution. Keeping this in a separate "perfetto" feature branch while I work on it.
Data is gathered from the Perfetto trace through trace_processor_shell.exe. Trace_processor_shell.exe opens an interface that allows for making SQL queries over HTTP/RPC to localhost. All the trace data is retrieved with SQL queries. Data is serialized over the HTTP interface with Protobuf objects. The original TraceProcessor protobuf object (trace_processor.proto) and the C# conversions are included in the project.
PerfettoSourceParser will start the trace_processor_shell.exe process. SQL Queries will be made over HTTP and the protobuf output will be converted to objects of type PerfettoSqlEvent. One query will be made per SQL table. Each query will produce events of the same type and will be processed by their own individual source cooker. For a complete generic event, we need data from 5 tables: slice, args, thread_track, thread, and process. A composite cooker will then take all the data gathered from each individual source cooker and join them to create the final generic event.
For example, for the slice table, the process goes like this:
Perform a SQL query into the Perfetto trace through trace_processor_shell.exe ("select * from slice"). Returns a QueryResult object
Convert QueryResult object into individual PerfettoSliceEvents. One event for each row in the SQL table
PerfettoSliceCooker will process/store all the PerfettoSliceEvents.
Once all the other tables have also finished, PerfettoGenericEventCooker will gather all the events from each cooker and do a join on them to create complete PerfettoGenericEvent objects.
Create WPA table of PerfettoGenericEvents