{"id":20033002,"url":"https://github.com/schwindelig/postmortem","last_synced_at":"2025-09-20T07:31:51.397Z","repository":{"id":38322099,"uuid":"173412347","full_name":"schwindelig/postmortem","owner":"schwindelig","description":":skull: :fire: :snowflake: A basic analyzer for memory dumps containing managed code","archived":false,"fork":false,"pushed_at":"2022-12-08T04:08:42.000Z","size":507,"stargazers_count":5,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-08T08:57:13.263Z","etag":null,"topics":["analysis","automated","clrmd","crash","crash-dump","dump","memory-dump","post-mortem","windbg"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/schwindelig.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-03-02T06:30:43.000Z","updated_at":"2024-07-02T13:58:23.000Z","dependencies_parsed_at":"2023-01-25T08:16:43.032Z","dependency_job_id":null,"html_url":"https://github.com/schwindelig/postmortem","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/schwindelig/postmortem","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schwindelig%2Fpostmortem","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schwindelig%2Fpostmortem/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schwindelig%2Fpostmortem/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schwindelig%2Fpostmortem/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/schwindelig","download_url":"https://codeload.github.com/schwindelig/postmortem/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/schwindelig%2Fpostmortem/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276064222,"owners_count":25578997,"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","status":"online","status_checked_at":"2025-09-20T02:00:10.207Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["analysis","automated","clrmd","crash","crash-dump","dump","memory-dump","post-mortem","windbg"],"created_at":"2024-11-13T09:44:04.349Z","updated_at":"2025-09-20T07:31:51.025Z","avatar_url":"https://github.com/schwindelig.png","language":"C#","readme":"# PostMortem\n\nA basic analyzer for memory dumps containing managed code. Reports are provided as `.md` and `.html` files.\n\nThe console app is targeting .net core 2.2, while the `PostMorem.Core` and `PostMorem.Markdown` libraries target .net standard 2.0.\n\nThe idea and analysing code is heavily inspired (if not just copy-pasted) from the [ClrMD project](https://github.com/Microsoft/dotnet-samples/tree/master/Microsoft.Diagnostics.Runtime/CLRMD).\n\n## Examples\n\nExamples are based on memory dumps generated on the [aspnet-crash website](https://github.com/dougrathbone/aspnet-crash)\n\n### Hang\n\nWorker Processes hanging in `Thread.Sleep`\n\n- Analysis Report 1 [HTML](https://htmlpreview.github.io/?https://github.com/schwindelig/postmortem/blob/master/docs/example-reports/hung-workers/1216b609-3c4a-4dba-9515-9a156e99a1f6-analysis-report.html) | [Markdown](docs/example-reports/hung-workers/1216b609-3c4a-4dba-9515-9a156e99a1f6-analysis-report.md)\n- Analysis Report 2 [HTML](https://htmlpreview.github.io/?https://github.com/schwindelig/postmortem/blob/master/docs/example-reports/hung-workers/f4786bf0-a9f0-4e08-b207-e06c5d50b316-analysis-report.html) | [Markdown](docs/example-reports/hung-workers/f4786bf0-a9f0-4e08-b207-e06c5d50b316-analysis-report.md)\n- Compare Report [HTML](https://htmlpreview.github.io/?https://github.com/schwindelig/postmortem/blob/master/docs/example-reports/hung-workers/8c48119f-5303-48ea-91aa-1b6cf809d5ef-compare-report.html) | [Markdown](docs/example-reports/hung-workers/8c48119f-5303-48ea-91aa-1b6cf809d5ef-compare-report.md)\n\n### Crash\n\n`StackOverflowException` by recursion and creating thousands of `SomeData` instances\n\n- Analysis Report [HTML](https://htmlpreview.github.io/?https://github.com/schwindelig/postmortem/blob/master/docs/example-reports/stackoverflow/e397f00b-1516-4995-9e43-b2c456429871-analysis-report.html) | [Markdown](docs/example-reports/stackoverflow/e397f00b-1516-4995-9e43-b2c456429871-analysis-report.md)\n\n### Memory Leak\n\nCaused by not disposing `MemoryStream`s and `XmlSerializer`s\n\n- Analysis Report 1 [HTML](https://htmlpreview.github.io/?https://github.com/schwindelig/postmortem/blob/master/docs/example-reports/memoryleak/abf0841f-11ad-4cf3-88c8-530c9af3c783-analysis-report.html) | [Markdown](docs/example-reports/memoryleak/abf0841f-11ad-4cf3-88c8-530c9af3c783-analysis-report.md)\n- Analysis Report 2 [HTML](https://htmlpreview.github.io/?https://github.com/schwindelig/postmortem/blob/master/docs/example-reports/memoryleak/626456c3-6685-4828-bf75-2d3e16f64c5f-analysis-report.html) | [Markdown](docs/example-reports/memoryleak/626456c3-6685-4828-bf75-2d3e16f64c5f-analysis-report.md)\n- Compare Report [HTML](https://htmlpreview.github.io/?https://github.com/schwindelig/postmortem/blob/master/docs/example-reports/memoryleak/8a25287f-1c1e-43a6-81d7-1f98a8e2c452-compare-report.html) | [Markdown](docs/example-reports/memoryleak/8a25287f-1c1e-43a6-81d7-1f98a8e2c452-compare-report.md)\n\n## Libraries used\n\n- [ClrMD](https://github.com/Microsoft/dotnet-samples/tree/master/Microsoft.Diagnostics.Runtime/CLRMD)\n- [ClrMD.Extensions](https://github.com/JeffCyr/ClrMD.Extensions)\n- [MarkDig](https://github.com/lunet-io/markdig)\n- [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json)\n- [Serilog](https://github.com/serilog/serilog)\n- [Serilog.Sinks.Console](https://github.com/serilog/serilog-sinks-console)\n- [CommandLineParser](https://github.com/commandlineparser/commandline)\n\n## Usage\n\nClone this repository, run `dotnet restore` and publish it. In the published directory, run\n```bash\ndotnet .\\PostMortem.dll\n```\nwith the following parameters\n\n```bash\n  -p, --path          Required. Path to the memory dump\n\n  -v, --verbose       (Default: false) Verbose output\n\n  -o, --output-dir    Required. Directory where the results should be saved\n\n  -s, --path2         Path to the second memory dump\n\n  --help              Display this help screen.\n\n  --version           Display version information.\n```\n\n## Features\n\n### Analysis Report\n\nThe analysis report provides the following information:\n\n#### Runtime Info\n\n- Pointer Size\n- Heap Count\n- Flag indicating if Server Garbage Collection is in use\n\n#### Memory Regions\n\n- Total Size\n- Count\n- Type\n\n#### Heap Segments\n\n- Start\n- End\n- Committed End\n- Reserved End\n- Heap\n- Type\n\n#### Heap Balance\n\n- Heap\n- Size in Bytes\n\n#### App Domains\n\n- Name\n- Loaded Modules\n\n#### Threads\n\n- Indication if thread contains exception\n- Information about exception, such as type, message and hresult\n- Stack trace\n  - Stack Pointer\n  - Instruction Pointer\n  - Method Display String\n\n#### Top Objects\n\n- Displays top 1000 objects by total size\n  - Type\n  - Indicator if type directly implements `IDisposable`\n  - Count / number of instances\n  - Total size in bytes\n\n### Compare Report\n\nPostMortem allows you to compare two memory dumps. See the `--help` details, on which parameters to use.\n\n#### Matching Threads\n\nDisplays threads where the thread id within both dumps matches.\n\nMatching stack traces are displayed in the table below. A visual indication (:snowflake:) is given when both stack traces seem to be equal.\n\n#### Object Count Diff\n\nDisplays a list of the most common objects, order by the difference in instances between the two dumps.\n\nIf a type directly implements `IDisposable` a visual indication (:warning:) is displayed in the `Implements IDisposable` column.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fschwindelig%2Fpostmortem","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fschwindelig%2Fpostmortem","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fschwindelig%2Fpostmortem/lists"}