{"id":52337,"date":"2026-06-22T16:51:40","date_gmt":"2026-06-22T20:51:40","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=52337"},"modified":"2026-06-22T16:54:24","modified_gmt":"2026-06-22T20:54:24","slug":"crashreportextension","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2026\/06\/22\/crashreportextension\/","title":{"rendered":"CrashReportExtension"},"content":{"rendered":"<p><a href=\"https:\/\/developer.apple.com\/documentation\/CrashReportExtension\">CrashReportExtension<\/a>:<\/p>\n<blockquote cite=\"https:\/\/developer.apple.com\/documentation\/CrashReportExtension\">\n<p>The Crash Report Extension framework allows you to perform analysis and produce a report when your app crashes. Your crash-handling code executes out-of-process, rather than from a signal handler or other in-process techniques.<\/p>\n<p>You implement your handler by writing an app extension that conforms to the <a href=\"https:\/\/developer.apple.com\/documentation\/crashreportextension\/crashreporterextension\"><code>CrashReporterExtension<\/code><\/a> protocol. The system calls your <a href=\"https:\/\/developer.apple.com\/documentation\/crashreportextension\/crashreporterextension\/processcrashreport(process:)\"><code>processCrashReport(process:)<\/code><\/a> method when the app crashes. Use the <a href=\"https:\/\/developer.apple.com\/documentation\/crashreportextension\/crashedprocess\"><code>CrashedProcess<\/code><\/a> parameter to inspect the state of the crashed app by retrieving a crash reason, symbolicating relevant addresses, and communicating with the process over a read-only Mach port. After collecting the crash data, you can send a report back to your own server.<\/p>\n<p>[&#8230;]<\/p>\n<p>Crash Report Extension is available on iOS 27 and later. It isn&rsquo;t available to Catalyst-based macOS apps, or on iOS apps running on Mac computers with Apple silicon.<\/p>\n<\/blockquote>\n\n<p>The top of the page says &ldquo;macOS 27.0+,&rdquo; so I <a href=\"https:\/\/mastodon.social\/@siracusa\/116718106963615769\">guess<\/a> this means it <em>does<\/em> work for regular AppKit and SwiftUI Mac apps. It&rsquo;s great to finally have a supported way to do this.<\/p>\n\n<p>I don&rsquo;t know why they can&rsquo;t just give you the crash report text or <tt>.ips<\/tt> JSON directly, though. It looks like you have to use Mach IPC with the <code>corpsePort<\/code> to get the backtrace for each thread and then use the extension API to symbolicate the addresses. Even then, I&rsquo;m not sure you can get all the information that&rsquo;s in a standard crash report, such as the Application Specific Backtrace. Maybe you can find the address for <a href=\"https:\/\/alastairs-place.net\/blog\/2013\/01\/10\/interesting-os-x-crash-report-tidbits\/\"><code>gCRAnnotations<\/code>\/<code>__crashreporter_info__<\/code><\/a> and load it with <code>mach_vm_read<\/code>?<\/p>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2026\/06\/17\/wwdc-2026-links\/\">WWDC 2026 Links<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2024\/03\/20\/visual-studio-app-center-retirement\/\">Visual Studio App Center Retirement<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2023\/10\/16\/what-happened-to-__crashreporter_info__\/\">What Happened to __crashreporter_info__?<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2023\/09\/04\/restarting-macos-apps-automatically-on-crash\/\">Restarting macOS Apps Automatically on Crash<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2012\/07\/14\/crash-reporting-for-sandboxed-mac-apps\/\">Crash Reporting for Sandboxed Mac Apps<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2011\/09\/15\/reliable-crash-reporting\/\">Reliable Crash Reporting<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>CrashReportExtension: The Crash Report Extension framework allows you to perform analysis and produce a report when your app crashes. Your crash-handling code executes out-of-process, rather than from a signal handler or other in-process techniques. You implement your handler by writing an app extension that conforms to the CrashReporterExtension protocol. The system calls your processCrashReport(process:) method [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2026-06-22T20:51:44Z","apple_news_api_id":"4a470697-e0ef-4abb-8478-b11b2ff9766b","apple_news_api_modified_at":"2026-06-22T20:51:44Z","apple_news_api_revision":"AAAAAAAAAAD\/\/\/\/\/\/\/\/\/\/w==","apple_news_api_share_url":"https:\/\/apple.news\/ASkcGl-DvSruEeLEbL_l2aw","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[4],"tags":[1621,2479,905,31,2887,2255,30,281,2792,2784,71],"class_list":["post-52337","post","type-post","status-publish","format-standard","hentry","category-programming-category","tag-marzipan","tag-crash-reporter","tag-extensions","tag-ios","tag-ios-27","tag-ios-apps-on-macos","tag-mac","tag-mach","tag-mach-o","tag-macos-27","tag-programming"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/52337","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=52337"}],"version-history":[{"count":1,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/52337\/revisions"}],"predecessor-version":[{"id":52338,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/52337\/revisions\/52338"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=52337"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=52337"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=52337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}