Skip to main content
The Dark Art of Postmortem DebuggingRead
Illustrative. Synthetic data.
48,20911:14:00.1188421 8476WlibEGLEGLNativeWindowType 0x7c11 disconnect failed
48,21011:14:00.353703 703VAudioFlingerwrite blocked for 4 ms
48,21111:14:00.6671247 1282DJobSchedulerjob 1204 for com.mapview.app deferred: idle
48,21211:14:00.8871247 1274IActivityManagerDisplayed com.mapview.app/.MapActivity: +412ms
48,21311:14:01.0361247 1291IWifiServicerequestNetwork uid 10214 NetworkRequest [ id=44 ]
48,21411:14:01.3001247 1247IWifiServicerequestNetwork uid 10214 NetworkRequest [ id=44 ]
48,21511:14:01.5291247 1247VInputDispatcherMotionEvent ACTION_MOVE 0.0/0.0 -> 611.2/1244.0
48,21611:14:01.712703 710VAudioFlingerwrite blocked for 4 ms
48,21711:14:01.9038421 8421WartAlloc concurrent copying GC freed 2KB(0B), 2% free 501MB/512MB, paused 412ms total 1.9s
48,22711:14:02.5818466 8466DMapView.Syncbinder txn 0x1a22 queued, 3 in flight
48,22811:14:03.2008421 8446WlibEGLEGLNativeWindowType 0x7c11 disconnect failed
48,22911:14:03.9728421 8421IartBackground concurrent copying GC freed 118KB, 3% free 497MB/512MB, paused 188ms
48,23011:14:04.3248421 8458WlibEGLEGLNativeWindowType 0x7c11 disconnect failed
48,23111:14:05.0918421 8421DMapView.Tiletile 14/8812/5391 decoded in 12 ms
48,23211:14:05.6478421 8421IartExplicit concurrent copying GC freed 6KB, 2% free 501MB/512MB, paused 396ms
48,23311:14:06.141612 645DSurfaceFlingerlayer MapActivity#0 damage 1080x2280
48,23411:14:06.8068466 8490WMapView.Syncbinder reply from main waited 2210 ms, retrying
48,23511:14:07.5578466 8514DMapView.Syncbinder txn 0x1a22 queued, 3 in flight
48,23611:14:07.9111247 1301EActivityManagerANR in com.mapview.app (pid 8421): Input dispatching timed out (waited 5001 ms), main thread in art::GC
48,24211:14:08.1608421 8421WActivityThreadhandleWindowVisibility: no activity for token BinderProxy@4c1
48,24311:14:08.3421247 1301IActivityManagerWrote stack traces to /data/anr/anr_2026-09-15-11-14-08-001
48,24411:14:08.4871247 1277IActivityManagerDisplayed com.mapview.app/.MapActivity: +412ms
48,24511:14:08.705612 640WSurfaceFlingerMapActivity#0 dropped 41 frames in 1000 ms
48,24611:14:08.8738421 8421IMapView.Sessionviewport 0.0000,0.0000 z14.2 bearing 0
48,24711:14:09.0818421 8479DMapView.NetGET /v3/tiles/14/8812/5391.pbf 200 (38 ms)
48,24811:14:09.283612 612DBufferQueue[MapActivity#0](this:0x7f00) dequeueBuffer slot 2
48,24911:14:09.4128421 8421FAndroidRuntimeFATAL EXCEPTION: main java.lang.OutOfMemoryError: Failed to allocate 8388624 byte allocation with 11220 free bytes
48,25011:14:09.8901247 1247IActivityManagerDisplayed com.mapview.app/.MapActivity: +412ms
48,25111:14:10.3578421 8421IProcessSending signal. PID: 8421 SIG: 9
48,25211:14:10.6721247 1247DTelephonyRegistrynotifySignalStrength: subId 1
48,25311:14:11.0621247 1247IActivityManagerProcess com.mapview.app (pid 8421) has died: fore TOP
48,25411:14:11.592703 706VAudioFlingerwrite blocked for 4 ms
48,25511:14:11.8401247 1247DDisplayPowerControllerbrightness 118 -> 121
01
02
03
Root-cause read-out

The fatal line is where the story ends.

com.mapview.app did not run out of memory at 11:14:09. Its heap was 98% full eight seconds earlier and every collection after that stalled the main thread, so the ANR at 11:14:07 and the OutOfMemoryError at 11:14:09 are the second and third lines of one chain that starts at line 48,217.

0148,21711:14:01.903W art: heap 501 of 512 MB, collection freed 2 KB
0248,23611:14:07.911E ActivityManager: input dispatch timed out, main thread in GC
0348,24911:14:09.412F AndroidRuntime: OutOfMemoryError, 8 MB allocation

A logcat is mostly noise. The three lines that explain a crash are rarely next to each other, and never next to the crash.

Android logcat analyzer
Illustrative. Synthetic data.threadtime, 52,318 lines
48,20311:14:00.1188421 8476WlibEGLEGLNativeWindowType 0x7c11 disconnect failed
48,20411:14:00.252703 703VAudioFlingerwrite blocked for 4 ms
48,20511:14:00.4321247 1282DJobSchedulerjob 1204 for com.mapview.app deferred: idle
48,20611:14:00.5571247 1274IActivityManagerDisplayed com.mapview.app/.MapActivity: +412ms
48,20711:14:00.6431247 1291IWifiServicerequestNetwork uid 10214 NetworkRequest [ id=44 ]
48,20811:14:00.7931247 1247IWifiServicerequestNetwork uid 10214 NetworkRequest [ id=44 ]
48,20911:14:00.9241247 1247VInputDispatcherMotionEvent ACTION_MOVE 0.0/0.0 -> 611.2/1244.0
48,21011:14:01.029703 710VAudioFlingerwrite blocked for 4 ms
48,21111:14:01.1548466 8466DMapView.Syncbinder txn 0x1a22 queued, 3 in flight
48,21211:14:01.2858421 8446WlibEGLEGLNativeWindowType 0x7c11 disconnect failed
48,21311:14:01.4498421 8421VChoreographerframe 2261 scheduled, vsync 16.6 ms
48,21411:14:01.5701247 1247DJobSchedulerjob 1204 for com.mapview.app deferred: idle
48,21511:14:01.6511247 1247DTelephonyRegistrynotifySignalStrength: subId 1
48,21611:14:01.784703 722VAudioFlingerwrite blocked for 4 ms
48,21711:14:01.9038421 8421WartAlloc concurrent copying GC freed 2KB(0B), 2% free 501MB/512MB, paused 412ms total 1.9s
48,21811:14:02.3498466 8514DMapView.Syncbinder txn 0x1a22 queued, 3 in flight
48,21911:14:02.6408421 8421WActivityThreadhandleWindowVisibility: no activity for token BinderProxy@4c1
48,22011:14:02.946612 612DSurfaceFlingerlayer MapActivity#0 damage 1080x2280
48,22111:14:03.3108421 8421ElibEGLcalled unimplemented OpenGL ES API
48,22211:14:03.5258421 8421IMapView.Sessionviewport 0.0000,0.0000 z14.2 bearing 0
48,22311:14:03.8758421 8421IartBackground concurrent copying GC freed 118KB, 3% free 497MB/512MB, paused 188ms
48,22411:14:04.1738466 8503DMapView.Syncbinder txn 0x1a22 queued, 3 in flight
48,22511:14:04.4841247 1247VInputDispatcherMotionEvent ACTION_MOVE 0.0/0.0 -> 611.2/1244.0
48,22611:14:04.7641247 1260DConnectivityServiceNetworkAgentInfo [WIFI () - 104] validation 0
48,22711:14:05.1391247 1247VInputDispatcherMotionEvent ACTION_MOVE 0.0/0.0 -> 611.2/1244.0
48,22811:14:05.504703 706VAudioFlingerwrite blocked for 4 ms
48,22911:14:05.8058421 8421IartExplicit concurrent copying GC freed 6KB, 2% free 501MB/512MB, paused 396ms
48,23011:14:06.0731247 1247VInputDispatcherMotionEvent ACTION_MOVE 0.0/0.0 -> 611.2/1244.0
48,23111:14:06.3891247 1247DConnectivityServiceNetworkAgentInfo [WIFI () - 104] validation 0
48,23211:14:06.7721247 1258DJobSchedulerjob 1204 for com.mapview.app deferred: idle
48,23311:14:07.0618466 8490WMapView.Syncbinder reply from main waited 2210 ms, retrying
48,23411:14:07.3301247 1296DStorageManagergetVolumeList uid 10214
48,23511:14:07.7198466 8505EMapView.Nettile 14/8813/5391 timed out after 3000 ms (retry 1/3)
48,23611:14:07.9111247 1301EActivityManagerANR in com.mapview.app (pid 8421): Input dispatching timed out (waited 5001 ms), main thread in art::GC
48,23711:14:08.0711247 1247IWifiServicerequestNetwork uid 10214 NetworkRequest [ id=44 ]
48,23811:14:08.1788421 8421IMapView.Sessionviewport 0.0000,0.0000 z14.2 bearing 0
48,23911:14:08.2801247 1298VWindowManagerrelayoutWindow: viewVisibility 0
48,24011:14:08.4238421 8421DMapView.Tiletile 14/8812/5391 decoded in 12 ms
48,24111:14:08.4951247 1301IActivityManagerWrote stack traces to /data/anr/anr_2026-09-15-11-14-08-001
48,24211:14:08.6301247 1306DTelephonyRegistrynotifySignalStrength: subId 1
48,24311:14:08.7511247 1247IPowerManagerServiceuserActivity uid 1000 event 2
48,24411:14:08.845612 640WSurfaceFlingerMapActivity#0 dropped 41 frames in 1000 ms
48,24511:14:08.9928466 8472EMapView.Nettile 14/8813/5391 timed out after 3000 ms (retry 1/3)
48,24611:14:09.1018466 8466DMapView.Syncbinder txn 0x1a22 queued, 3 in flight
48,24711:14:09.1838421 8457IMapView.Sessionviewport 0.0000,0.0000 z14.2 bearing 0
48,24811:14:09.300703 755VAudioFlingerwrite blocked for 4 ms
48,24911:14:09.4128421 8421FAndroidRuntimeFATAL EXCEPTION: main java.lang.OutOfMemoryError: Failed to allocate 8388624 byte allocation with 11220 free bytes
48,25011:14:09.6468421 8421WlibEGLEGLNativeWindowType 0x7c11 disconnect failed
48,25111:14:09.8248466 8494DMapView.Syncbinder txn 0x1a22 queued, 3 in flight
48,25211:14:10.0158421 8421IProcessSending signal. PID: 8421 SIG: 9
48,25311:14:10.2281247 1278DTelephonyRegistrynotifySignalStrength: subId 1
48,25411:14:10.3781247 1247IActivityManagerProcess com.mapview.app (pid 8421) has died: fore TOP
48,25511:14:10.5708421 8421IMapView.Sessionviewport 0.0000,0.0000 z14.2 bearing 0
48,25611:14:10.7638421 8421Ichattyuid=10214(com.mapview.app) identical 12 lines
48,25711:14:10.9758466 8519DMapView.Syncbinder txn 0x1a22 queued, 3 in flight
48,25811:14:11.1031247 1264IPowerManagerServiceuserActivity uid 1000 event 2
48,25911:14:11.320612 639DBufferQueue[MapActivity#0](this:0x7f00) dequeueBuffer slot 2
pen: signal
Root-cause read-out

The fatal line is where the story ends.

com.mapview.app did not run out of memory at 11:14:09. Its heap was 98% full eight seconds earlier and every collection after that stalled the main thread, so the ANR at 11:14:07 and the OutOfMemoryError at 11:14:09 are the second and third lines of one chain that starts at line 48,217.

0148,21711:14:01.903W art: heap 501 of 512 MB, collection freed 2 KB
0248,23611:14:07.911E ActivityManager: input dispatch timed out, main thread in GC
0348,24911:14:09.412F AndroidRuntime: OutOfMemoryError, 8 MB allocation

A logcat is mostly noise. The three lines that explain a crash are rarely next to each other, and never next to the crash.

01
02
03
02Why logcat analysis is hard
whole capture, 5 min 02 s, 52,318 lines
9 s, 3 lines
0:001:002:003:004:005:00

Finding the signal in the noise is a daily struggle.

01
Massive volume
Thousands of log lines per minute. A 5-minute capture can have 50K+ entries. Finding the one crash in the noise takes forever.
02
Grep complexity
grep -i 'error\|exception\|crash' | grep -v 'expected' | ... Complex regex chains that still miss issues or return too much noise.
03
Missing context
Found an error? Now scroll back to find what happened before it. Correlating timestamps, tags, and PIDs manually is tedious.
04
Cross-component issues
App crash caused by system service? Memory pressure from another app? Root causes span multiple components and tags.
The real cost of manual analysis
01Hours spent scrolling through log output
02Complex grep commands that still miss issues
03Context switching between terminal, IDE, and docs
04Tribal knowledge: only experts know the right tags to filter
05Repeated work: the same debugging steps for every crash report

Five minutes of capture. The entire failure is nine seconds wide and forty lines deep, and grep for error returns 1,904 lines around it.

03What logcat.ai does differently
evidence left, answer right

Cross-layer reasoning, well past search and filtering.

The stream is the evidence. Each read below starts from it and ends in a sentence.

01three PIDs, one chain
8421DMapView.Tiletile 14/8812/5391 decoded in 12 ms
8421WartGC freed 2KB, 2% free 501MB/512MB, paused 412ms
612DBufferQueuedequeueBuffer slot 2
1247EActivityManagerANR in com.mapview.app: Input dispatching timed out
1247IActivityManagerWrote stack traces to /data/anr/anr_2026-09-15
8421FAndroidRuntimeFATAL EXCEPTION: main java.lang.OutOfMemoryError
Trace root causes across components
Ask 'Why did my app crash?' and the investigation follows the chain: system service failure, binder death, process restart.
Correlates events across tags and PIDs.
Returns the causal sequence, with the matching line as its start rather than its answer.
02common crash patterns we detect
FFATAL EXCEPTIONUncaught exception causing app termination
EANRApplication Not Responding, UI thread blocked
FOOMMemory exhaustion crashing the app
ENPENull reference access in your code
WGC THRASHMemory pressure, collections freeing nothing
Automatic issue detection
Crashes, ANRs, memory pressure, and GC thrashing detected automatically.
Issues ranked by severity with surrounding context.
Stack traces linked to the events that triggered them.
03activity, whole capture
0:001:002:003:004:005:00
filter 4:04 to 4:22
Timeline visualization
See activity spikes at a glance.
Filter by time range interactively.
Correlate events visually across processes.
Identify patterns over time.
04quick search
>show camera errors after 2pm
3 lines in 4.1 s: cameraserver, pid 703, 14:02 to 14:07
cited to the lines it came from
Ask questions in plain English
Natural language queries: 'Show camera errors after 2pm.'
No grep expertise required.
Answers in under 5 seconds.
04How it works
the same ten lines, four times

Four steps from raw logs to actionable fixes.

01adb logcat > capture.txt
48,214DJobSchedulerjob 1204 deferred: idle
48,215IActivityManagerDisplayed .MapActivity: +412ms
48,216VChoreographerframe 2261 scheduled
48,217WartGC freed 2KB, 2% free 501/512MB
48,218DBufferQueuedequeueBuffer slot 2
48,223IartGC freed 118KB, paused 188ms
48,236EActivityManagerANR: input dispatch timed out
48,241DMapView.NetGET /v3/tiles 200 (38 ms)
48,249FAndroidRuntimeFATAL OutOfMemoryError
48,251IActivityManagerProcess 8421 has died
Upload your logs
Drag and drop a logcat file or paste from adb logcat.
026 of 10 lines recede
48,214DJobSchedulerjob 1204 deferred: idle
48,215IActivityManagerDisplayed .MapActivity: +412ms
48,216VChoreographerframe 2261 scheduled
48,217WartGC freed 2KB, 2% free 501/512MB
48,218DBufferQueuedequeueBuffer slot 2
48,223IartGC freed 118KB, paused 188ms
48,236EActivityManagerANR: input dispatch timed out
48,241DMapView.NetGET /v3/tiles 200 (38 ms)
48,249FAndroidRuntimeFATAL OutOfMemoryError
48,251IActivityManagerProcess 8421 has died
Filter by tag and level
logcat.ai identifies important tags and filters the noise.
03three lines, one chain
48,214DJobSchedulerjob 1204 deferred: idle
48,215IActivityManagerDisplayed .MapActivity: +412ms
48,216VChoreographerframe 2261 scheduled
48,217WartGC freed 2KB, 2% free 501/512MB
48,218DBufferQueuedequeueBuffer slot 2
48,223IartGC freed 118KB, paused 188ms
48,236EActivityManagerANR: input dispatch timed out
48,241DMapView.NetGET /v3/tiles 200 (38 ms)
48,249FAndroidRuntimeFATAL OutOfMemoryError
48,251IActivityManagerProcess 8421 has died
Correlate stack traces
Links crashes to app lifecycle events and user actions.
04one sentence, one fix
48,214DJobSchedulerjob 1204 deferred: idle
48,215IActivityManagerDisplayed .MapActivity: +412ms
48,216VChoreographerframe 2261 scheduled
48,217WartGC freed 2KB, 2% free 501/512MB
48,218DBufferQueuedequeueBuffer slot 2
48,223IartGC freed 118KB, paused 188ms
48,236EActivityManagerANR: input dispatch timed out
48,241DMapView.NetGET /v3/tiles 200 (38 ms)
48,249FAndroidRuntimeFATAL OutOfMemoryError
48,251IActivityManagerProcess 8421 has died
The heap filled at 11:14:01; the ANR and the crash follow from it.
fixrelease the tile cache in onTrimMemory and cap it at 96 MB
Get actionable fixes
Specific code-level recommendations for each issue.
05Watch it work on a real one
Real Deep Research · Android logcat + kernel boot log · device identity substituted

The full investigation, end to end.

Not a highlight. The entire deep-research run, scrolling from the triage report through the real faults to the fix it recommends.

Deep Research · one logcat, one question

“This boot log has a kernel WARN_ON and dozens of init errors. Which are real problems, and what's the root cause of each?”

Platform Quectel QSM560DR (QCM6490)Kernel Linux 5.4 qgkiSubsystem PMIC · Charger · SPMI · SELinux
The investigation6 of 42 steps
Fork WARN_ON, PMIC and error-spike threads
one WARN_ON at 05:45:50.664
Confirm the WARN_ON trace
sleeping IPC wait inside a notifier
Find the charger table defect
thermal levels not descending
Trace the SPMI failures upstream
one slave never completes, -EIO
Check the I²C companion PMICs
two unreachable, -107
Sort the rest into real vs expected
eight real faults; the rest noise
The answer

One real WARN_ON in the charger IPC path; about eight of the init errors are real

The single kernel WARN_ON is a real driver defect in the Qualcomm battery-charger IPC path, and of the dozens of init errors only about eight are real problems — led by an SPMI bus fault that leaves the pmr735a@4 PMIC's GPIO and temperature-alarm blocks unbound — while the bulk of the volume is Android's expected two-stage firmware loading and device-tree entries for hardware this board does not populate. One WARN_ON fires, at 01-01 05:45:50.664 (CPU 6, PID 599, kernel/rcu/tree_plugin.h:293), because battery_chg_write blocks in wait_for_completion_timeout while running under power_supply_changed_work's atomic_notifier_call_chain — a genuine driver-context defect that did not crash the system. The real init failures are: three spmi-0 transaction failures (0x3) against qcom,pmr735a@4 that abort both its pinctrl@8800 and temp-alarm@a00 probes with -5; PM8008 I2C timeouts (rc=-107) leaving two chip-enable regulators unregistered; a malformed charger thermal-mitigation table; the rtc6226 FM tuner losing GPIO 354 with -16; five RPMh LDOs (ldoe2–ldoe6) with no address mapping; a missing regulatory.db; a missing APEX SEPolicy package forcing a full policy compile; and several SELinux policy gaps. The firmware "Direct load failed (-2) → sysfs fallback" messages, including qca6490/amss20.bin, are the normal Android loader path and are not defects.

The one kernel WARN_ON is a real driver defect: the battery-charger driver performs a blocking completion wait from inside an atomic notifier callback.
An SPMI arbiter fault against slave qcom,pmr735a@4 leaves that PMIC's GPIO controller and its temperature-alarm block unbound for the whole boot.
The PM8008 companion PMICs do not answer on I2C bus 984000.i2c, so two chip-enable regulators are never registered — a separate fault from the SPMI one, on a different bus.
The battery charger's device-tree thermal-mitigation table is malformed, and the fault reappears at every boot in this log — but it stays inside driver initialisation.
Fix: move the charger's completion wait out of the notifier path; then the descending-order thermal table
boot_issue · Qualcomm BSP / PMIC, Charger and SPMI Init
Real Deep Research output · device identity substituted
01triage reportwhat broke, ranked
02root causethe chain, cited by line
03the fixthe driver path it points at
06Charts from a real capture
the visual layer

A sample of the visual layer.

Generated straight from the log, no setup, no queries. The system read this stream's shape and what was breaking in it, then built the views that fit.

Errors & warnings / min
peak 1.2kmin 1
05:4921:03
Errors & warnings / min
Log lines by level
D
9.0k
I
2.4k
E
2.0k
V
1.5k
W
673
Log lines by level
07How a logcat reaches you
three situations

Logcat is what you have when the crash is not reproducible on your desk.

01adb logcat > file.txt
48,000 lines, scrolled by hand
A wall of log you're scrolling by hand

Tens of thousands of lines and the one that matters is somewhere in the middle. The run above picked the one kernel warning that is a real driver defect out of dozens of boot errors, and named the line, so you start at the cause, not line one.

02tester's device, no stack
the failure is in the sequence
A crash that only shows in the log

No stack in the report, just a stream from a tester's device. The investigation reads the sequence, ties the failure to the system state around it, and tells you what led up to it, cited, not guessed.

03what spiked, and when
a picture, not a paragraph
A log you need to see, not read

Sometimes the answer is a picture, not a paragraph. The charts weren't pre-canned; the system read this stream's shape and what was breaking in it, then built the views that fit: what spiked, when, and around which failure.

08What is Android logcat?
six levels, one pen

Logcat is Android's system logging mechanism.

It captures everything: app logs, system events, crashes, ANRs, and more. Every Android developer needs to read logcat, but with thousands of lines per minute, finding what matters is the challenge.

Log levels explained
VVerbose
DDebug
IInfo
WWarning
EError
FFatal

Level is what the line says about itself. Severity is what the analysis says after reading the lines around it: a D line can be the cause, an E line can be nothing.

10Frequently asked questions
everything you need to know about logcat analysis

Questions, answered plainly.

01
What logcat formats are supported?

We support all standard logcat formats including threadtime (default), brief, time, tag, and raw. Upload directly from Android Studio's Logcat export, adb logcat output, CI/CD test artifacts, or logs extracted from bugreports. The parser auto-detects the format and handles mixed-format files.

02
How long does analysis take?

Quick Search delivers answers in under 5 seconds for simple queries. AI Insights analysis, which scans for crashes, ANRs, and patterns, completes in 3-4 minutes. Deep Research investigations that trace root causes through multiple log entries take 5-10 minutes depending on the complexity of the issue.

03
What issues can it detect?

Our AI detects crashes with full stack traces linked to source code, ANRs with thread dumps showing the blocked thread, uncaught exceptions with context, memory pressure and GC thrashing, performance issues like slow frames and jank, and custom error patterns specific to your app. Issues are ranked by severity with direct links to the relevant log lines.

04
Where can I get logcat files?

Capture logs using adb logcat > file.txt from command line, export from Android Studio's Logcat window (File → Export), collect from CI/CD test runs (Firebase Test Lab, BrowserStack, etc.), or extract from bugreports. We also support logs from third-party crash reporting tools like Crashlytics and Sentry.

05
Is my log data secure?

Your log data is encrypted in transit (TLS 1.3) and at rest (AES-256), processed in your own tenant, and never used to train AI models. Files are deleted after 90 days, or immediately from your dashboard. Enterprise plans offer on-premise deployment for regulated or air-gapped environments.

06
Can I analyze large logcat files?

Yes: optimized for large files with streaming upload and efficient indexing. Our indexing engine handles millions of log lines without performance degradation.

11Stop grepping, start understanding
Illustrative. Synthetic data.
three lines of 52,318
8421WartGC freed 2KB, 2% free 501MB/512MB, paused 412ms
1247IActivityManagerWrote stack traces to /data/anr/anr_2026-09-15
1247EActivityManagerANR in com.mapview.app: Input dispatching timed out
612WSurfaceFlingerMapActivity#0 dropped 41 frames in 1000 ms
8421FAndroidRuntimeFATAL EXCEPTION: main java.lang.OutOfMemoryError

A logcat is mostly noise. The three lines that explain a crash are rarely next to each other, and never next to the crash.

Stop grepping. Start understanding.

Upload your logs and let logcat.ai surface the root cause.