Your QA lead messages you at 2:47 PM: “App crashed during the Brazil payment flow.” No stack trace. No screenshot. Just a crash.
You know the drill. You pick up the test device, plug in the USB cable, open a terminal on your laptop, run adb logcat, and start filtering. You filter by the app’s package name. You reproduce the crash — tap through the payment flow, enter the Brazilian CPF, submit. The app crashes again. Now you look at Logcat.
Except the PID filter you set is stale. When the app crashed, the process died and relaunched with a new PID. Your filter is showing logs from the old process. You clear the filter and scroll through the unfiltered Logcat buffer. There are 10,000 lines of system noise — GnssHAL_GnssInterface, InputDispatcher, ActivityTaskManager, ConnectivityService — all interleaved with the logs you actually need. You scroll. You scroll more. You find a FATAL EXCEPTION line. You read the stack trace, follow the “Caused by” chain through three nested exceptions, and finally reach the root cause buried in the third Caused by block: an IllegalArgumentException in a text encoder that doesn’t handle the cedilla character in the Brazilian name “Gonçalves.”
It took you 38 minutes. Twelve of those minutes were spent reproducing the crash because you didn’t have Logcat running when it first happened. Another eight were spent scrolling through log noise because PID filtering broke when the process died. The rest was reading and interpreting a stack trace on a 14-inch laptop screen that you had to pull out of your bag.
Now imagine a different version of 2:47 PM. Your QA lead messages: “App crashed during the Brazil payment flow.” You pick up the test device. You open Test Nexus. You tap Deep Inspector. The crash is already there — full stack trace, captured the moment it happened, timestamped, with the device state at the time of the crash. You tap the share icon. The stack trace is in Jira before 2:49 PM.
You didn’t plug in a cable. You didn’t open a laptop. You didn’t reproduce anything. You didn’t scroll through a single line of Logcat. The crash was captured automatically because Deep Inspector was already running in the background.
That’s the entire value proposition. Deep Inspector doesn’t analyze your crashes for you. It makes sure you never lose one. The stack trace that used to take 38 minutes of USB cables, PID filter wrestling, and Logcat scrolling to find is now sitting on your screen two seconds after the crash happens.
Why You Keep Losing Crashes
Before we get into how Deep Inspector works, it’s worth understanding exactly why the current workflow fails so reliably. It’s not that the tools are broken — it’s that they require you to be watching at the exact moment the crash happens.
The Timing Problem
Logcat is a real-time log viewer. If you weren’t running Logcat when the crash occurred, the stack trace exists in the device’s log buffer for a limited time — typically a few minutes, depending on how verbose other apps and system services are. On a busy test device with multiple apps installed, the buffer rotates fast. By the time you plug in the USB cable, open a terminal, and start adb logcat, the crash data may already be gone.
This creates a reproduction dependency: you have to make the crash happen again while you’re watching. For deterministic crashes (tap this button, see this crash), that’s annoying but manageable. For intermittent crashes — race conditions, memory pressure, specific network timing — reproduction can take hours or may not happen at all during the debugging session.
The PID Problem
When you filter Logcat by PID (the standard approach to isolate your app’s output), you’re filtering by the process ID assigned when the app launched. When the app crashes, the process dies. When it relaunches (either automatically or when you reopen it), it gets a new PID. Your filter is now showing nothing, because the PID that produced the crash no longer exists. You have to either remove the filter and swim through unfiltered noise, or know the old PID and filter specifically for it — which requires you to have been watching before the crash.
The Context Problem
Even when you successfully capture a stack trace via Logcat, you get the raw exception chain and nothing else. You don’t get a record of the device’s memory state when the crash happened. You don’t get the battery level (relevant for low-power behavior changes). You don’t get the network type (Wi-Fi vs. cellular vs. airplane mode). You don’t get whether the app was in the foreground or background. You piece this context together from memory — “I think I had Wi-Fi on” — or you don’t have it at all.
How Deep Inspector Works
Deep Inspector runs as a background service on your Android device. It captures logs from all apps, and actively monitors the apps you select for crashes, ANRs, and performance issues — automatically, no ADB, no USB cable, no laptop, no need to be watching at the moment of the crash.
What Gets Captured
When an issue occurs, Deep Inspector records:
The full stack trace — the complete exception chain, including nested “Caused by” blocks. Not just the top-level exception, but the entire causal chain down to the root cause. This is the same data you’d see in Logcat, captured before the log buffer has a chance to rotate it out.
The context buffer — 50 lines of logs from before the issue occurred and 20 lines after. This shows you the exact sequence of app actions, API calls, or UI events that led to the failure.
Device state at the moment of the crash:
- Device model and Android version
- Available memory and total memory
- Battery level and charging state
- Network type (Wi-Fi, cellular, none)
App context:
- Package name of the crashed app
- SDK version of the device
Timestamp — the exact time the issue occurred, so you can correlate it with your testing activity. “I was testing the payment flow at 2:47” maps directly to the crash captured at 2:47:12.
What You Can Do With Captured Issues
Once an issue is captured, Deep Inspector gives you several ways to use the data:
Read the stack trace on your device. The full exception chain is displayed in a scrollable view, formatted for readability. You don’t need a laptop screen to read it. For most crashes, the root cause is identifiable directly from the device.
See the context. Tap into the context view to see the logs leading up to the issue. This is where you find the failed API call or the invalid user input that triggered the crash.
Copy to clipboard. One tap copies the full stack trace, formatted and ready to paste into a Jira ticket, Slack message, GitHub issue, or email. The copied text includes the exception chain, device state, and timestamp — everything a developer needs to start debugging.
Export. Download complete reports in Plain Text, JSON, CSV, or browser-viewable HTML. HTML exports are color-coded and formatted, making them perfect for attaching to formal bug reports.
Review history. Deep Inspector maintains a chronological log of all issues from the current testing session. If three crashes and an ANR happened during a 2-hour session, they are all captured and listed. This is critical for identifying patterns and verifying that your fixes work across different scenarios.
All captured data is stored in AES-256 encrypted local databases on the device.
The Before and After
Let’s make the comparison concrete. Same crash, two workflows:
Without Deep Inspector
2:47 PM — QA reports crash happened
2:48 PM — Find the test device
2:49 PM — Locate USB cable, plug into laptop
2:50 PM — Open terminal, run adb logcat
2:51 PM — Set PID filter for the app
2:52 PM — Reproduce the crash (attempt 1)
2:53 PM — App crashes. PID filter shows nothing — PID changed
2:54 PM — Clear filter, start scrolling unfiltered Logcat
2:55 PM — Find GnssHAL_GnssInterface... ConnectivityService... not relevant
2:58 PM — Still scrolling...
3:02 PM — Find FATAL EXCEPTION line
3:03 PM — Read first Caused by: NumberFormatException — not the root cause
3:05 PM — Read second Caused by: IllegalStateException — still wrapping
3:07 PM — Read third Caused by: IllegalArgumentException in TextEncoder — root cause
3:10 PM — Copy stack trace from laptop terminal to Jira
3:12 PM — Write bug report context from memory
3:15 PM — Bug report filed
Total time: 28 minutes. Twelve of those minutes were overhead — finding cables, connecting devices, scrolling noise. The actual diagnostic work (reading the stack trace, identifying the root cause) took about 10 minutes. The rest was plumbing.
With Deep Inspector
2:47 PM — QA reports crash happened
2:47 PM — Pick up test device, open Test Nexus
2:47 PM — Tap Deep Inspector — crash is already captured with full stack trace
2:48 PM — Read the exception chain on-device — third Caused by: IllegalArgumentException
2:49 PM — Tap copy — stack trace + device context is on clipboard
2:49 PM — Open Jira, paste, add one sentence of context
2:50 PM — Bug report filed
Total time: 3 minutes. And all three of those minutes were actual diagnostic work — reading the trace and filing the report. Zero plumbing.
The time savings aren’t from faster analysis. They’re from eliminating every step between “a crash happened” and “I’m looking at the stack trace.” No cable. No laptop. No reproduction. No scrolling. The data was captured the moment it happened.
Cross-App Monitoring
Deep Inspector captures logs from every app on the device, and actively monitors the apps you choose for crashes, ANRs, performance drops, and other issues. You select which apps to monitor — your app under test, specific third-party SDKs, or the entire device. This is useful in several real testing scenarios:
Third-party SDK crashes. Your app integrates an ad SDK, an analytics library, or a payment processor. When that SDK crashes inside your app’s process, the stack trace shows your app as the crashed package — but the root cause is in the third-party code. Deep Inspector captures these crashes the same way, so you can see whether the FATAL EXCEPTION originated in your code or in com.someadnetwork.sdk.
Shared device debugging. On a shared QA device, crashes from other testers’ apps are captured too. If the device is exhibiting strange behavior (slowdowns, network issues), reviewing the crash history might reveal that a debug build installed by another tester is crashing repeatedly in the background, consuming resources.
Device health baseline. Before starting a test session, glance at Deep Inspector’s crash history. If system services or pre-installed apps are crashing frequently, the device may have stability issues that could affect your test results. Better to know before you spend two hours testing on an unstable device.
Writing Effective Bug Reports From Deep Inspector Data
Capturing the crash is only half the job. The bug report you write determines how quickly it gets fixed. Deep Inspector gives you everything you need to write a bug report that a developer can act on immediately, without asking follow-up questions.
What to Include
A developer receiving your bug report needs to answer three questions: what happened, under what conditions, and can they reproduce it? Here’s how to structure the report using Deep Inspector’s captured data:
1. Summary — One sentence describing the trigger. “App crashes when submitting payment with a Brazilian name containing cedilla characters.”
2. Steps to Reproduce — What you were doing when the issue happened. Deep Inspector captures the timestamp, so you can reconstruct your exact actions from your testing notes.
3. Stack Trace — Copy the full exception chain from Deep Inspector. Don’t truncate it. Don’t paraphrase it. Paste the raw text. The developer needs to see the complete “Caused by” chain to identify whether the root cause is in application code, a library, or a framework component.
4. Context Buffer — Include the preceding logs from Deep Inspector. These logs show the API responses and UI events that triggered the failure, making the “why” behind the crash visible.
5. Device Context — Deep Inspector captures this automatically:
- Device model and Android version
- Available memory at time of issue (was it a low-memory situation?)
- Network state (was the device offline when the network call failed?)
- Battery level (was the device in battery saver mode?)
6. Test Data Context — If you were using DataHub-generated profiles, note which country and data types were active. “Testing with Brazilian profile: CPF 382.916.547-20, name Maria Fernanda Silva.” This gives the developer the exact input that triggered the crash, making reproduction trivial.
The Bug Report That Gets Fixed First
Here’s the difference between a bug report that sits in the backlog and one that gets fixed the same day:
Weak report: “App crashed during payment testing.”
Strong report (built from Deep Inspector data):
Summary: IllegalArgumentException in TextEncoder when processing
Brazilian name with cedilla (ç) character
Steps:
1. Set country to Brazil in DataHub
2. Generated profile: Fernanda Costa Gonçalves, CPF 382.916.547-20
3. Opened payment flow → entered card details → entered name → tapped Submit
4. App crashed immediately on submit
Stack trace: [full trace from Deep Inspector — pasted directly]
Context Logs: [preceding 50 lines showing the successful card validation
and the subsequent call to the text encoder]
Root cause (from reading the trace):
TextEncoder.encode() at PaymentFormValidator.java:247 throws
IllegalArgumentException when input contains U+00E7 (Latin small
letter c with cedilla). The encoder appears to reject characters
outside basic ASCII.
Device context:
- Pixel 7, Android 14, SDK 34
- Memory: 2.1 GB available / 8 GB total
- Network: Wi-Fi
- Battery: 73%, not charging
Reproduction: 100% reproducible with any name containing ç, ã,
or other Latin Extended characters. Tested with "José Antônio" —
same crash. Tested with "John Smith" — no crash.
That report contains everything a developer needs: the exact input, the complete stack trace, the root cause line, the device context, and a reproduction pattern. It took 5 minutes to write because Deep Inspector had already captured all the raw data.
💡 Pro Tip: AI-Assisted Analysis
Deep Inspector captures and displays the raw crash data. For help interpreting complex stack traces — especially multi-threaded crashes, native code exceptions, or unfamiliar framework errors — copy the stack trace and paste it into any AI assistant for analysis. Describe what you were doing when the crash happened, paste the trace, and ask for a root cause analysis. This is particularly useful for stack traces involving framework code or third-party libraries you’re not familiar with.
When to Run Deep Inspector
Deep Inspector is designed to run continuously during your testing sessions with minimal battery and performance impact. Here’s when it provides the most value:
Always during manual testing. If you’re physically interacting with an app on the device, Deep Inspector should be running. You never know when a crash will happen, and the entire point is capturing crashes you didn’t expect.
During exploratory testing. When you’re testing edge cases, unusual input combinations, or stress scenarios, crashes are most likely — and most likely to be non-deterministic. Deep Inspector captures the first occurrence, eliminating the “can you reproduce it?” question.
When testing with generated data. If you’re using DataHub to test with country-specific profiles (accented characters, unusual address formats, long phone numbers), these are exactly the inputs that surface encoding bugs, validation gaps, and format handling errors. Having Deep Inspector running means every crash triggered by test data is captured immediately.
When handing a device to a non-technical tester. If a product manager, designer, or client is testing the app on a device, they won’t know how to capture a stack trace. Deep Inspector captures it automatically. When they say “it crashed,” you can look at the crash history and see exactly what happened.
When Deep Inspector Isn’t Needed
Automated test suites. If you’re running Espresso, UI Automator, or other automated test frameworks, those frameworks have their own crash detection and reporting mechanisms. Deep Inspector is designed for manual and exploratory testing where no automated monitoring is in place.
Deep CPU/memory profiling. Deep Inspector detects crashes, ANRs, OOM errors, and UI performance drops (skipped frames) — but it’s not a CPU or memory profiler. For detailed thread-level profiling, heap dumps, or allocation tracking, use Android Studio’s Profiler. Deep Inspector catches the symptoms (crash, freeze, stutter); a profiler diagnoses the underlying resource usage patterns.
Quick Reference
| Aspect | Without Deep Inspector | With Deep Inspector |
|---|---|---|
| Catching an issue | Must be watching Logcat at the exact moment | Auto-captured in background |
| Equipment needed | USB cable + laptop + terminal | Just the test device |
| PID filter issues | PID changes on crash — filter breaks | No PID filtering needed |
| Log noise | 10,000 lines to scroll through | Only failure data, clean and formatted |
| Reproduction | Must reproduce issue to capture trace | First occurrence captured automatically |
| Device context | Reconstructed from memory (“I think I had Wi-Fi on”) | Captured automatically at failure time |
| Sharing | Copy from laptop terminal → paste to Jira | One tap: copy or export directly from device |
| Session History | Each issue requires manual capture | Full session history maintained |
| Cross-app monitoring | Requires separate monitoring per app | Selected apps monitored simultaneously |
| Time to bug report | 20–40 minutes | 3–5 minutes |
Get Started
Deep Inspector requires one setup step the first time: granting the READ_LOGS permission. This is an Android restriction — reading logs from other apps requires a one-time ADB command. Test Nexus walks you through it with a guided setup screen, and if you’ve already set up Wireless ADB (Post #11), you can do it right from your phone without a computer.
- Grant READ_LOGS permission — one-time setup:
adb shell pm grant us.twocan.testnexus android.permission.READ_LOGS - Open Test Nexus → Navigate to Deep Inspector
- Select target apps — choose which apps to actively monitor for issues
- Start monitoring — Deep Inspector begins watching in the background
- Test normally — use your app, test with DataHub data, run any scenario
- When an issue occurs — open Deep Inspector to see the captured crash, ANR, or performance data
- Copy or export — share the stack trace and device context with your team
Once the permission is granted, it persists across app updates and reboots — you never need to run the command again. Deep Inspector runs alongside every other Test Nexus module. Generate a test profile in DataHub, set a mock location, enable Deep Inspector, and start your testing session. If anything crashes, the trace is waiting for you.
🚀 Stop losing stack traces to Logcat buffer rotation and PID filter failures.
Deep Inspector captures crashes, ANRs, and performance issues automatically on your selected apps — one ADB command to set up, then never touch a cable again.
Download Test Nexus →
What’s Next
- Post #12 — Deep Inspector Deep Dive: Health Dashboard, 7 issue types, notifications, context capture, export formats, and boot recovery — everything beyond crash capture
- Post #05 — AI Custom Forms + Autofill: define any form structure, let Gemini fill it with realistic data, and inject it into your app with Android’s Autofill Framework
- Post #06 — Terminal: full SSH, SFTP, and port forwarding from your test device