{"id":25836047,"url":"https://github.com/bugsplat-git/my-example-crasher","last_synced_at":"2026-05-25T16:31:43.097Z","repository":{"id":85977808,"uuid":"265634859","full_name":"BugSplat-Git/my-example-crasher","owner":"BugSplat-Git","description":"Example demonstrating a situation where BugSplat's group feature is useful.","archived":false,"fork":false,"pushed_at":"2024-02-23T15:23:50.000Z","size":23,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-11-28T19:44:29.668Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://docs.bugsplat.com/introduction/development/grouping-crashes","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/BugSplat-Git.png","metadata":{"files":{"readme":"README.md","changelog":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-05-20T17:12:11.000Z","updated_at":"2024-02-23T15:19:15.000Z","dependencies_parsed_at":"2023-07-22T05:46:03.266Z","dependency_job_id":null,"html_url":"https://github.com/BugSplat-Git/my-example-crasher","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/BugSplat-Git/my-example-crasher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BugSplat-Git%2Fmy-example-crasher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BugSplat-Git%2Fmy-example-crasher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BugSplat-Git%2Fmy-example-crasher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BugSplat-Git%2Fmy-example-crasher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BugSplat-Git","download_url":"https://codeload.github.com/BugSplat-Git/my-example-crasher/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BugSplat-Git%2Fmy-example-crasher/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33483810,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-25T14:31:05.219Z","status":"ssl_error","status_checked_at":"2026-05-25T14:31:02.878Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2025-03-01T01:38:58.300Z","updated_at":"2026-05-25T16:31:43.079Z","avatar_url":"https://github.com/BugSplat-Git.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![bugsplat-github-banner-basic-outline](https://user-images.githubusercontent.com/20464226/149019306-3186103c-5315-4dad-a499-4fd1df408475.png)](https://bugsplat.com)\n\u003cbr/\u003e\n# \u003cdiv align=\"center\"\u003eBugSplat\u003c/div\u003e \n### **\u003cdiv align=\"center\"\u003eCrash and error reporting built for busy developers.\u003c/div\u003e**\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://twitter.com/BugSplatCo\"\u003e\n        \u003cimg alt=\"Follow @bugsplatco on Twitter\" src=\"https://img.shields.io/twitter/follow/bugsplatco?label=Follow%20BugSplat\u0026style=social\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://discord.gg/K4KjjRV5ve\"\u003e\n        \u003cimg alt=\"Join BugSplat on Discord\" src=\"https://img.shields.io/discord/664965194799251487?label=Join%20Discord\u0026logo=Discord\u0026style=social\"\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n# Grouping Crashes\n\nDeciding which crashes your team should focus on can seem daunting. For many applications, it's impossible to investigate every crash. Fortunately, BugSplat automatically groups similar crashes, allowing you to concentrate your efforts on the bugs causing the most instability.\n\nBugSplat's [Summary](https://app.bugsplat.com/v2/summary) page is a table of crash groups. Usually, crash reports are grouped by the top stack frame when the application crashes. However, sometimes the top of a stack contains common code that causes unrelated crashes to be grouped together. When this happens, auto-group rules can automatically select a lower stack frame that more accurately groups related crashes.\n\n### Auto-Group Rules\n\nBugSplat has a set of customizable rules that skip over functions that are typically not interesting to application developers. Our default rules are designed to get you started quickly and can be modified as required for each crash report database.\n\nThe auto-group rules are pattern-based matching rules that skip irrelevant stack frames and create more meaningful crash groups. The three types of rules are **group by**, **group after,** and **ignore** frames. Rules are defined per platform and can be specified to match either the function or file portion of the call stack.\n\nYou can view and change Auto-Group rules on the [Settings/Grouping](https://app.bugsplat.com/v2/database/grouping) page.\n\nLet's take a look at how BugSplat groups a report with the Windows OS function `KERNELBASE!RaiseException` at the top of the stack. Our default rule is shown below:\n\n\u003cfigure\u003e\u003cimg src=\"../../.gitbook/assets/image (10).png\" alt=\"\"\u003e\u003cfigcaption\u003e\u003cp\u003eDefault Ignore Rule\u003c/p\u003e\u003c/figcaption\u003e\u003c/figure\u003e\n\nThis rule, for Windows Native C++ crash types, **groups after** any stack frame where the function matches `KERNELBASE*`. When BugSplat processes reports containing `KERNELBASE!RaiseException`, the rule matches and crashes will automatically be grouped by the following frame of the call stack. Group after rules are useful for excluding frames that are known to be common error conditions. \\\\\n\nDevelopers can also add rules that **group by** frames matching certain patterns. **Group by** rules are useful for including items that can be identified as belonging to your application. For example, you might choose **group by** to specify a file matching a path on your build machine, or a function matching your main application's module.\n\nAuto-Group rules are matched via [glob patterns](https://en.wikipedia.org/wiki/Glob\\_\\(programming\\)). The following table describes common glob patterns.\n\n\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth width=\"122\"\u003ePattern\u003c/th\u003e\u003cth width=\"495\"\u003eDescription\u003c/th\u003e\u003cth width=\"170\"\u003eExample\u003c/th\u003e\u003cth width=\"310\"\u003eMatches\u003c/th\u003e\u003cth width=\"224\"\u003eDoes not match\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e*\u003c/code\u003e\u003c/td\u003e\u003ctd\u003ematches any number of any characters including none\u003c/td\u003e\u003ctd\u003eLaw*\u003c/td\u003e\u003ctd\u003eLaw, Laws, or Lawyer\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e**\u003c/code\u003e\u003c/td\u003e\u003ctd\u003ematches any number of path/directory segments. When used must be the only contents of a segment.\u003c/td\u003e\u003ctd\u003e/**/some.*\u003c/td\u003e\u003ctd\u003e/foo/bar/bah/some.txt, /some.txt, or /foo/some.txt\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e?\u003c/code\u003e\u003c/td\u003e\u003ctd\u003ematches any single character\u003c/td\u003e\u003ctd\u003e?at\u003c/td\u003e\u003ctd\u003eCat, cat, Bat or bat\u003c/td\u003e\u003ctd\u003eat\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e[abc]\u003c/code\u003e\u003c/td\u003e\u003ctd\u003ematches one character given in the bracket\u003c/td\u003e\u003ctd\u003e[CB]at\u003c/td\u003e\u003ctd\u003eCat or Bat\u003c/td\u003e\u003ctd\u003ecat or bat\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e[a-z]\u003c/code\u003e\u003c/td\u003e\u003ctd\u003ematches one character from the range given in the bracket\u003c/td\u003e\u003ctd\u003eLetter[0-9]\u003c/td\u003e\u003ctd\u003eLetter0, Letter1, Letter2 up to Letter9\u003c/td\u003e\u003ctd\u003eLetters, Letter or Letter10\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e[!abc]\u003c/code\u003e\u003c/td\u003e\u003ctd\u003ematches one character that is not given in the bracket\u003c/td\u003e\u003ctd\u003e[!C]at\u003c/td\u003e\u003ctd\u003eBat, bat, or cat\u003c/td\u003e\u003ctd\u003eCat\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e[!a-z]\u003c/code\u003e\u003c/td\u003e\u003ctd\u003ematches one character that is not from the range given in the bracket\u003c/td\u003e\u003ctd\u003eLetter[!3-5]\u003c/td\u003e\u003ctd\u003eLetter1, Letter2, Letter6 up to Letter9 and Letterx etc.\u003c/td\u003e\u003ctd\u003eLetter3, Letter4, Letter5 or Letterxx\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\nAuto-group rules are processed in a specific, consistent order that cannot be changed. The rules engine follows the logic below:\n\n* If there are any **group by** stack frame matches, select the top-most matching frame as the candidate frame. Use the resulting frame for grouping. Don't process any more rules.\n* If there are any **group after** stack frame matches, select the lower-most matching frame as the candidate frame. Starting with this frame, skip over any frames that match the **ignore** rules until finding the first frame that isn't to be ignored. Use the resulting frame for grouping. Don't process any more rules.\n* At this point, neither **group by** nor **group after** rules matched any stack frames. The rules engine will apply the **ignore** rules starting with the top stack frame, skipping over any frames that match the **ignore** rules until it finds the first frame that isn't to be ignored. The resulting frame is used for grouping.\n\n  \u003e When you specify a new Auto-Group rule, it will be applied to newly processed and reprocessed crashes only. If you'd like to batch reprocess crashes to apply new rules, please reach out to [Support](mailto:support@bugsplat.com).\n\n### Crashes Page\n\nThe [**Crashes**](https://app.bugsplat.com/v2/crashes) page displays a list of reports and their associated group under the **Stack Key** column. We've added a rule that effectively skips `KERNELBASE!RaiseException` and the reports are now grouped by the next frame in the stack `MyConsoleCrasher!_CxxThrowException(75)`. To see the report's stack trace, click the value in the **ID** column.\n\n![Crashes page](https://github.com/BugSplat-Git/my-example-crasher/assets/2646053/fb9e39f3-2387-475c-b179-ac3a73dc3949)\n\n### Crash Page\n\nOn the **Crash** page, scroll down to the list of stack frames for the crashing thread. Notice that we didn't quite get our grouping rules correct. Our rules have caused the report to be grouped under the function in bold, `MyConsoleCrasher!_CxxThrowException`**.** The function we actually want to group on is `MyConsoleCrasher!ThrowByUser`. Expand the row containing `MyConsoleCrasher!ThrowByUser` to reveal the **Group Rules** button.\n\n![Crash page](https://github.com/BugSplat-Git/my-example-crasher/assets/2646053/9cfdaea1-dcab-4948-92b9-09bcefac1ee6)\n\nWe can click **Group Rules** and add another rule that **groups after** stack frames where the function matches the glob `*_CXXThrowException*`. After creating this rule and reprocessing the crash report, you will see the correct grouping.\n\n### Summary Page\n\nOnce new grouping rules have been applied, navigate to the [**Summary**](https://app.bugsplat.com/v2/summary) page to view an overview of groups in the selected database. The **Summary** page provides report counts for all of the various groups. Targeting groups with the highest report **Count** will generally give teams the best return on their efforts. Another interesting metric to target is **Users Affected,** which represents the number of unique users that ran into a specific problem during the selected time frame.\n\n![Summary page](https://github.com/BugSplat-Git/my-example-crasher/assets/2646053/3434f247-f903-4793-b51d-ca7daadc1a81)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbugsplat-git%2Fmy-example-crasher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbugsplat-git%2Fmy-example-crasher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbugsplat-git%2Fmy-example-crasher/lists"}