{"id":17858489,"url":"https://github.com/microsoft/profile-explorer","last_synced_at":"2026-02-27T00:09:36.714Z","repository":{"id":259670082,"uuid":"842089156","full_name":"microsoft/profile-explorer","owner":"microsoft","description":"CPU profiling trace viewer","archived":false,"fork":false,"pushed_at":"2025-03-20T16:35:12.000Z","size":74246,"stargazers_count":152,"open_issues_count":5,"forks_count":14,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-03-28T22:11:39.469Z","etag":null,"topics":["arm64","cpu","etw","performance","profiler","windows","x64"],"latest_commit_sha":null,"homepage":"https://github.com/microsoft/profile-explorer","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/microsoft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.MD","funding":null,"license":"LICENSE.TXT","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-13T16:43:18.000Z","updated_at":"2025-03-28T03:25:28.000Z","dependencies_parsed_at":"2025-03-20T17:37:25.594Z","dependency_job_id":null,"html_url":"https://github.com/microsoft/profile-explorer","commit_stats":{"total_commits":1381,"total_committers":12,"mean_commits":"115.08333333333333","dds":0.4330195510499638,"last_synced_commit":"ddb3aded842393f7e24b44541f4462b437de408c"},"previous_names":["microsoft/profile-explorer"],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Fprofile-explorer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Fprofile-explorer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Fprofile-explorer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Fprofile-explorer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/microsoft","download_url":"https://codeload.github.com/microsoft/profile-explorer/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247261600,"owners_count":20910108,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arm64","cpu","etw","performance","profiler","windows","x64"],"created_at":"2024-10-28T05:07:28.981Z","updated_at":"2026-02-27T00:09:36.659Z","avatar_url":"https://github.com/microsoft.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Profile Explorer\r\n[![Static Badge](https://img.shields.io/badge/Download-x64-orange)](https://github.com/microsoft/profile-explorer/releases/latest/download/profile_explorer_installer_x64.exe)\r\n[![Static Badge](https://img.shields.io/badge/Download-ARM64-orange)](https://github.com/microsoft/profile-explorer/releases/latest/download/profile_explorer_installer_arm64.exe)\r\n[![Static Badge](https://img.shields.io/badge/Documentation-blue)](https://microsoft.github.io/profile-explorer/)\r\n\r\nProfile Explorer is a tool for viewing CPU profiling traces collected through the [Event Tracing for Windows (ETW)](https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/event-tracing-for-windows--etw-) infrastructure on machines with x64 and ARM64 CPUs. Its focus is on presenting the slowest parts of the profiled application through an easy-to-use but detailed UI consisting of several views, such as a hot function list, flame graph, call tree, timeline, assembly code view, and source file view.  \r\n\r\nThe application can be viewed as a companion to [Windows Performance Analyzer (WPA)](https://learn.microsoft.com/en-us/windows-hardware/test/wpt/windows-performance-analyzer), offering some unique features based on the binary analysis it performs and the IDE-like UI, such as easy navigation through disassembly, improved mapping to source lines, displaying the function control-flow graph, viewing of multiple functions at the same time, marking, searching, filtering and much more.  \r\n\r\nOne of the app's key advantages is its performance. It loads traces fast and offers near-instant UI interaction, even for very large traces (over 10 GB ETL files). Most profile processing steps and algorithms are multi-threaded and don't block the UI.\r\n\r\n#### Summary, Flame Graph and Timeline views of a trace:\r\n\u003cimg width=\"884\" alt=\"image\" src=\"https://github.com/user-attachments/assets/dff9ddd1-e3e1-4063-bd29-65419786527e\"\u003e\r\n\r\n#### Assembly, Source File and Flow Graph views of a function:\r\n\u003cimg width=\"886\" alt=\"image\" src=\"https://github.com/user-attachments/assets/dac21739-49ba-4274-9d12-e0a1b4937bdf\"\u003e\r\n\r\n#### Video introduction\r\n\r\nhttps://github.com/user-attachments/assets/d9a281d3-dc92-4cbe-a3e5-80c4588676a2\r\n\r\n### ⬇️ Download\r\n\r\nInstallers for the latest version:\r\n- [x64 installer](https://github.com/microsoft/profile-explorer/releases/latest/download/profile_explorer_installer_x64.exe)\r\n- [ARM64 installer](https://github.com/microsoft/profile-explorer/releases/latest/download/profile_explorer_installer_arm64.exe)\r\n\r\nUse the ARM64 installer if you have a machine with an ARM64 CPU, since it includes a native build of the app (no emulation), otherwise use the x64 installer. Note that the x64 app can open traces taken on ARM64 machines and vice versa.  \r\n\r\nThe app also has a built-in auto-update feature that will notify you when a new version is released and offer to download and install it.  \r\nThe installers for previous versions can be downloaded from the [Releases](https://github.com/microsoft/profile-explorer/releases) page.  \r\n\r\n### 📖 Documentation\r\n\r\nThe documentation pages are available here:  \r\n#### [https://microsoft.github.io/profile-explorer](https://microsoft.github.io/profile-explorer/)\r\n\r\nThe app also has a built-in *Help panel* that can display the same documentation.  \r\nMost views have a *question mark* icon in the upper-right corner that opens the *Help panel* on the view's documentation page. \r\n\r\n### 🛠️ Building\r\n\r\nTo build the application and its external dependencies, ensure the following build tools are installed on a Windows 11 machine:  \r\n- recent Visual Studio 2022 with the following workflows:\r\n\t- *.NET desktop development*\r\n\t- *Desktop development with C++*\r\n\t- *C++ ARM64/ARM64EC build tools (Latest)* - for native ARM64 builds\r\n- [.NET 8.0 SDK ](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) (should be installed by Visual Studio 2022 already)\r\n\r\nFrom a an *admin* command-line window, run:  \r\n- ```build.cmd [debug|release]``` for an x64 build.  \r\n- ```build-arm64.cmd [debug|release]``` for a native ARM64 build.  \r\n\r\nThe debug or release build mode is used for the main project; external dependencies are always built in release mode. The admin mode for the command-line is required to register msdia140.dll using regsvr32; it needs to be done once on a machine.  \r\n\r\nThe build script will update the git submodules, build the main project and external dependencies, and then copy the built dependencies and other resources to the output directory.  \r\n\r\nThe output directory with *ProfileExplorer.exe* will be found at:  \r\n ```src\\ProfileExplorerUI\\bin\\[Debug|Release]\\net8.0-windows```.  \r\n\r\nAfter the initial build, open the solution file ```src\\ProfileExplorer.sln``` and use the *ProfileExplorerUI* project as the build and startup target.\r\n\r\n### 📦 Publishing and creating the installer\r\n\r\nTo publish the application and create an installer, from a command-line window run:  \r\n- ```installer\\x64\\prepare.cmd``` for an x64 build.  \r\n- ```installer\\arm64\\prepare.cmd``` for a native arm64 build.  \r\n\r\nThis will build the main project as a self-contained application, build the external dependencies, and create the installer executable, with build output files found at:  \r\n\r\n- ```installer\\[x64|arm64]\\out```  \r\n- ```installer\\[x64|arm64]\\profile_explorer_installer_VERSION.exe```\r\n\r\nCurrently [InnoSetup](https://jrsoftware.org/isdl.php) is used to create the installer and it must be already installed on the machine and *iscc.exe* found on *PATH*.\r\n\r\n### 📑 Project structure\r\n\r\nBelow is a high-level overview of the main parts of the application.\r\n\r\n| Location | Description |\r\n| --- | --- |\r\n| src/ProfileExplorerUI | The main project and application UI, implemented using WPF. |\r\n| src/ProfileExplorerCore | The UI-independent part that defines the intermediate representation (IR), parsing functions, Graphviz and Tree Sitter support, various data structures, algorithms and utilities. |\r\n| src/ProfileExplorerUITests | Unit tests for the ProfileExplorerUI project. |\r\n| src/ProfileExplorerCoreTests | Unit tests for the ProfileExplorerCore project. |\r\n| src/ManagedProfiler | .NET JIT profiler extension for capturing JIT output assembly code. |\r\n| src/PDBViewer | A small utility displaying the contents of PDB debug info files, implemented using WinForms. |\r\n| src/VSExtension | A Visual Studio extension that connects to the application. Not used for profiling functionality. |\r\n| src/GrpcLib | Defines the GRPC protobuf format used by the Visual Studio extension to communicate with the application. Not used for profiling functionality. |\r\n\r\nThe following projects are build from source, as either x64 or native arm64 binaries.\r\n\r\n| Location | Description |\r\n| --- | --- |\r\n| src/external/capstone | [Capstone](https://github.com/capstone-engine/capstone) disassembly framework, submodule. |\r\n| src/external/graphviz | [Graphviz](https://gitlab.com/graphviz/graphviz) graph visualization tools, submodule. |\r\n| src/external/tree-sitter | [Tree-sitter](https://tree-sitter.github.io/tree-sitter/) parser generator, with support for C/C++, C# and Rust, submodules. |\r\n| src/external/TreeListView | [TreeListView](https://github.com/hazzik/TreeListView), WPF tree list view control. |\r\n\r\n### Profiling architecture\r\n\r\n\u003cimg src=\"https://github.com/user-attachments/assets/77e00a73-4810-4155-b656-a356fff8ba3b\" width=70% height=70%\u003e  \r\n\r\n- Profiling UI compoments are independent from the profiling trace source.  \r\n- Loading the trace produces a set of profile samples and associated call stacks – building blocks for the call tree, flame graph, function list, assembly view.  \r\n- Debuging info (PDB) files are downloaded in parallel, source line info read on-demand per function.  \r\n- Binary disassembly done on-demand per function.  \r\n- Initial trace processing and subsequent filtering is multi-threaded.  \r\n- UI updates are mostly async and multi-threaded.  \r\n- Opening binaries without a profiling trace is supported.  \r\n\r\n### History\r\n\r\nThe application started as a tool for helping compiler developers interact with and better understand a compiler's [intermediate representation (IR)](https://en.wikipedia.org/wiki/Intermediate_representation). After adding simple support for viewing profile traces, it gradually gained more profiling features and primarily became a profile viewer.  \r\n\r\nThe tool's initial focus on compilers has led to some distinctive features, such as the ability to parse assembly code into an internal IR. This enables an interactive view of assembly code and the visualization of control-flow graphs, for example.\r\n\r\n### Contributing\r\n\r\nThis project welcomes contributions and suggestions.  Most contributions require you to agree to a\r\nContributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us\r\nthe rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.\r\n\r\nWhen you submit a pull request, a CLA bot will automatically determine whether you need to provide\r\na CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions\r\nprovided by the bot. You will only need to do this once across all repos using our CLA.\r\n\r\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\r\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or\r\ncontact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\r\n\r\n### Trademarks\r\n\r\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft \r\ntrademarks or logos is subject to and must follow \r\n[Microsoft's Trademark \u0026 Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\r\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\r\nAny use of third-party trademarks or logos are subject to those third-party's policies.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicrosoft%2Fprofile-explorer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmicrosoft%2Fprofile-explorer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicrosoft%2Fprofile-explorer/lists"}