{"id":26576678,"url":"https://github.com/getsentry/symbol-collector","last_synced_at":"2026-03-15T17:57:01.058Z","repository":{"id":40595310,"uuid":"224893096","full_name":"getsentry/symbol-collector","owner":"getsentry","description":"Clients and Server to collect system symbols.","archived":false,"fork":false,"pushed_at":"2025-03-17T17:22:18.000Z","size":13794,"stargazers_count":30,"open_issues_count":16,"forks_count":9,"subscribers_count":45,"default_branch":"main","last_synced_at":"2025-03-17T17:40:10.769Z","etag":null,"topics":["android","elf","linux","mach-o","macos","symbols","tag-production","team-gdx"],"latest_commit_sha":null,"homepage":"https://sentry.io","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/getsentry.png","metadata":{"funding":{"custom":["https://sentry.io/pricing/","https://sentry.io/"]},"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-29T16:58:21.000Z","updated_at":"2025-03-17T17:22:20.000Z","dependencies_parsed_at":"2024-02-05T17:27:21.146Z","dependency_job_id":"b4dc6bca-4ceb-4636-8b94-3bb64137bcf0","html_url":"https://github.com/getsentry/symbol-collector","commit_stats":null,"previous_names":[],"tags_count":46,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getsentry%2Fsymbol-collector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getsentry%2Fsymbol-collector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getsentry%2Fsymbol-collector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getsentry%2Fsymbol-collector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/getsentry","download_url":"https://codeload.github.com/getsentry/symbol-collector/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245050587,"owners_count":20552876,"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":["android","elf","linux","mach-o","macos","symbols","tag-production","team-gdx"],"created_at":"2025-03-23T03:25:55.403Z","updated_at":"2026-03-15T17:57:01.029Z","avatar_url":"https://github.com/getsentry.png","language":"C#","funding_links":["https://sentry.io/pricing/","https://sentry.io/"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://sentry.io\" target=\"_blank\" align=\"left\"\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/getsentry/sentry-unity/main/.github/sentry-wordmark-dark-400x119.svg?utm_source=github\u0026utm_medium=logo\" width=\"280\"\u003e\n  \u003c/a\u003e\n  \u003cbr /\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\n# Symbol Collector\n[![build](https://github.com/getsentry/symbol-collector/workflows/build/badge.svg?branch=main)](https://github.com/getsentry/symbol-collector/actions?query=branch%3Amain)\n[![codecov](https://codecov.io/gh/getsentry/symbol-collector/branch/main/graph/badge.svg)](https://codecov.io/gh/getsentry/symbol-collector)\n[![Discord Chat](https://img.shields.io/discord/621778831602221064.svg)](https://discord.gg/Ww9hbqr)\n\nCollect system symbols from different devices like Android, macOS, Linux, etc.\nIt involves a server that writes the symbols to Google cloud storage and a set of clients.\n\n![Symbol Collector on a device farm](.github/SymbolCollector.png?raw=true \"Devices\")\n\n## Uploading symbols\n\n### Client applications\n\nCurrent clients are:\n\n* Android\n* macOS\n* Linux\n\nThe client applications will parse files and make sure they are valid ELF, Mach-O, Fat Binary, etc.\nBesides that, before uploading it to the server, it will make a `HEAD` request with the image _build id_ to make sure\nthis file is still missing, to avoid wasting time and bandwidth uploading redundant files.\n\nLooking for system images in the filesystem and the HTTP requests happen in parallel, so to go through GBs and thousands of files takes only a few seconds.\nFinally, the client apps will upload its internal metrics to help reconcile the batch results and troubleshoot any issues.\n\n\n### cURL\nAlthough using the client programs is strongly recommended, it's possible to upload files via HTTP.\n\nFor example, uploading a batch of Android symbols:\n\n1. Create a batch:\n\n```sh\nexport batchId=$(uuidgen)\nexport batchFriendlyName=\"Android 4.4.4 - Sony Xperia\"\nexport batchType=\"Android\"\nexport body='{\"BatchFriendlyName\":\"'$batchFriendlyName'\",\"BatchType\":\"'$batchType'\"}'\nexport server=http://localhost:5000\n\ncurl -sD - --header \"Content-Type: application/json\" --request POST \\\n  --data \"$body\" \\\n  $server/symbol/batch/$batchId/start\n```\n2. Upload files:\n\n```sh\ncurl -i \\\n  -F \"libxamarin-app-arm64-v8a.so=@test/TestFiles/libxamarin-app-arm64-v8a.so\" \\\n  -F \"libxamarin-app.so=@test/TestFiles/libxamarin-app.so\" \\\n  $server/symbol/batch/$batchId/upload\n```\n3. Close batch (without providing metrics): \n\n```sh\ncurl -sD - --header \"Content-Type: application/json\" --request POST \\\n  --data \"{}\" \\\n  $server/symbol/batch/$batchId/close\n```\n\n## Why are you doing this?\n\nIn order to stack unwind from a memory dump, every loaded image involved in the call stack needs to be available.\nUnwind information is not in the debug files but in the libraries instead.\nThis project allows collecting these libraries so that native crash processing can be done on the backend as opposed to stackwalking on the client.\n\n## Releases\n\nThe [Releases page in this repository](https://github.com/getsentry/symbol-collector/releases) include builds for Android (apk), native CLIs for macOS and Linux (self contained), and the server.\n\n## Building from source\n\n### Dependencies\n\nThis project includes an Android app, an ASP.NET Core server and a Console apps as CLI clients for macOS and Linux.\nThe build script `build.sh` is focused on building **all** the components which means you'd need all the dependencies below.\n\n#### Server and Console app\n\nTo build the Server, Libraries and the Console app (aka: everything except the Android app) you'll need:\n* [.NET 10 SDK](https://dot.net)\n\n#### Android app\n\nTo build the Android project you need:\n* JDK 11\n* .NET Android workload: `dotnet workload install android`\n\n# Resources\n\n* [Droidcon talk that foreshadows this project](https://player.vimeo.com/video/380844400)\n* [Blog post about native crash reporting support](https://blog.sentry.io/2019/09/26/fixing-native-apps-with-sentry).\n* [Support Android native (NDK) crashes](https://blog.sentry.io/2019/11/25/adding-native-support-to-our-android-sdk/)\n* Sentry's [Symbolicator project](https://github.com/getsentry/symbolicator).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetsentry%2Fsymbol-collector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgetsentry%2Fsymbol-collector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetsentry%2Fsymbol-collector/lists"}