php-bug-catcher/bug-catcher-reporter-bundle
Symfony bundle that integrates Bug Catcher error reporting into PHP applications, capturing exceptions and forwarding diagnostic reports to the Bug Catcher service with configurable bundle setup.
Codeframe[], rendered in the Bug Catcher UI. This release doesn't change that positioning — it improves the fidelity of what you already own — so it's evidence for the "build/own it" side of the ledger rather than a reason to revisit the decision.Caused by: chain being absent so engineers reason about symptoms instead of causes. Worth tracking before/after on a sample of recent incidents.(1064): (classic SQL syntax errors) previously swallowed the real file and line, producing a frame pointing at the wrong place. Fewer "can you tell me where this actually came from?" round-trips.Caused by: labels require the matching server-side template change (bug-catcher/bug-catcher#19). Without it, extra frames still render — just unlabeled. That's a product decision about whether partial value ships now or you hold for a coordinated release.stack_trace already defaults to true), no service bindings or constructor signatures touched, wire format unchanged. Existing records are untouched because frames are parsed client-side at write time. That makes this a "slot into the next maintenance window" decision, not a project.Consider it when:
BugCatcherMonologHandler integrates there, and this release makes the Monolog path use the real Throwable when context['exception'] carries one, falling back to the formatted string otherwise.Look elsewhere when:
For executives (one paragraph). We can improve how quickly engineers diagnose production incidents at effectively zero cost and zero migration risk. Version 2.1.1 of our error-reporter bundle fixes two accuracy defects that have been sending engineers to the wrong line of code: the first stack frame was the caller instead of the actual throw site, and chained/cause exceptions were being discarded entirely. It's a drop-in patch — no configuration changes, no schema or wire-format changes, existing reports unaffected — so it can ride the next maintenance window. No new vendor spend, and error data continues to stay in our own infrastructure.
For engineering (the substance).
BugCatcher::logException() fed getTraceAsString() into the frame parser, but that string's #0 is already the caller of the throwing frame — the real position only exists in getFile()/getLine(), which that path never read. Separately, the Monolog path's synthetic #0 file(line): message line was parsed with a greedy /#\d+ (.*)\((\d+)\): (.*)/, so any message containing something like (1064): hijacked the file/line capture.ThrowSiteStacktrace builds the first Codeframe directly from the Throwable, reusing the vendor parser's code-window extraction so context lines match the parsed frames. It also walks getPrevious(), which ErrorFormater used to drop, labelling those frames Caused by: .... CollectCodeFrame gains collectThrowableFrames(Throwable); collectFrames(string) remains as fallback. WriteStackTraceListener always uses the new path; BugCatcherMonologHandler uses it whenever context['exception'] is a Throwable.serialize(Codeframe[]) so no server-side change is required. Existing records unaffected — frames are parsed client-side at write time.Caused by: labels need the matching server-side template change (bug-catcher/bug-catcher#19). Frames appear either way; without the template change they're just unlabeled. Recommend scheduling both together so the feature reads as intended in the dashboard.The ask. Approve the v2.1.1 bump for the next maintenance window, and pair it with deployment of the server-side template change so the cause-chain labels land in the same release.
How can I help you explore Laravel packages today?