Releases: PatilShreyas/debroid
Releases · PatilShreyas/debroid
Release list
v0.3.1
Fixed
- Daemon Startup Diagnostics & Log Redirection: Fixed silent timeouts when background daemon auto-spawn fails or terminates early. Daemon standard output and error are now captured at
~/.debroid/daemon.log, and startup diagnostics are surfaced directly in error responses for fast diagnosis (#57). - Event Polling Buffer Overflow Signal & Increased Capacity: Fixed unnotified event loss when polling is delayed under high event volume by adding
droppedEventsSinceLastPolltodebroid polloutput and increasing the in-memory event buffer capacity to 10,000 events (#92). - PID Fallback Exact Process Name Matching: Fixed an issue where the
ps -Afallback parser in AdbManager loosely matched package substrings, preventing erroneous PID matches for similarly-named applications (#59). - Include Method Arguments in
localsandpause-state: Fixed an issue wheredebroid localsanddebroid pause-stateomitted method parameters/arguments from the local variable inspection of a suspended thread. Function parameters are now properly displayed alongside locally declared variables, matching standard debugger behavior (#94).
v0.3.0
Added
- Automated Shell PATH Configuration: Enhanced
install.shto automatically detect the user's active shell (bash,zsh,fish) and register~/.local/binin the corresponding profile (.bashrc,.zshrc,config.fish). Includes recursive symlink resolution to preserve GNU Stow / Chezmoi dotfile setups, idempotent delimiter replacement (# >>> debroid installer >>>), and automatic skip when already on PATH (#75). - Installer Integration Test Suite: Added a hermetic multi-shell integration test suite (
scripts/test_install.sh) executed on every CI PR run, validating binary installation, shell PATH exports, subshell CLI version invocation, AI skill extraction, and dotfile symlink safety across environments (#75). - Rich Kotlin & Compound Expression Evaluation: The
debroid evalcommand now natively supports evaluating complex runtime expressions directly in your paused stack frame, including static methods, static constants/fields, compound boolean logic, short-circuiting, Kotlin properties, safe calls, default fallbacks, and type casting (#72, #79, #80):- Static Methods & Constants:
debroid eval <session_id> <thread_id> "Math.max(10, 20)",java.lang.System.currentTimeMillis(),Integer.MAX_VALUE,View.VISIBLE, orString.class(supports fully-qualified and simple class names with standard package imports likejava.lang,java.util,kotlin,android.util,android.view, etc., and Kotlin singleton/companion objects viaINSTANCE) (#79) - Compound Boolean Logic:
debroid eval <session_id> <thread_id> "amount >= 600.0 && isExpress" - Kotlin Property Access:
debroid eval <session_id> <thread_id> "user.address.city"(automatically resolves backing fields or getters likegetName()/isExpress()) - Safe Calls & Elvis Fallbacks:
debroid eval <session_id> <thread_id> "user?.address?.city ?: \"Unknown\"" - Runtime Type Checks & Type Casting:
debroid eval <session_id> <thread_id> "(account as AdminAccount).permissions"oraccount as? GuestAccount ?: fallback(supports safe/unsafe castingas/as?, type checksis/!is, and numeric conversions) - Mixed Arithmetic & String Formatting:
debroid eval <session_id> <thread_id> "\"Total: $\" + (amount * (1.0 - discount))"
- Static Methods & Constants:
Changed
- Omit Null Values in JSON Serialization: Configured CLI JSON serialization to omit null fields (
explicitNulls = false), reducing JSON payload size and saving context tokens for AI agents.
Fixed
- StringReference Incorrectly Marked as Primitive: Fixed an issue where
StringReferencevariable values were formatted withisPrimitive = truedespite providing a heapobjectId. Strings are reference types on the JVM heap and are now correctly reported withisPrimitive = false(#58). - Breakpoint ID in Poll Breakpoint Hit Event: Fixed an issue where polling for
BREAKPOINT_HITevents returnedbreakpointIdasnull. Registered breakpoint request IDs (bp_*) are now attached to JDI breakpoint requests and propagated into the poll event payload (#73). - JVM User Home Resolution in Launcher Stub: Updated the standalone binary launcher stub in
install.shand release workflow to pass-Duser.home="$USER_HOME"to the Java runtime, and added$HOMEenvironment variable fallbacks inSkillExtractor,UpdateCache, andBinaryUpdaterto ensure proper path resolution under custom$HOMEconfigurations and Linux environments (#75).
v0.2.0
Added
- VM Suspend Controls for Launch and Attach: Added
--no-suspendoption todebroid launchand--suspendflag todebroid attachallowing explicit control over whether the VM should be suspended immediately upon connection (#43).
Fixed
- Exit Code 0 for Informational CLI Flags: Ensured
CliRunnerexits with status code 0 when invoked with--help,--version, or--schemainstead of terminating with code 1 (#60). - Support Custom Daemon Port and Clean Up Dead Code: Added
--port/-poption andDEBROID_PORTenvironment variable toDebroidCliroot command to allow configuring custom daemon ports, and removed unused deadDebroidCommandclass (#61). - Clean ADB Port Forwards on Process Termination: Registered a JVM shutdown hook in
DaemonServerto ensure active JDI sessions and ADB port forwards are safely cleaned up and un-forwarded when the daemon process is terminated viaSIGTERM,Ctrl+C, or killed by the OS (#56). - Hang on Detach / Stop & App Freezing: Fixed an issue where
debroid detachanddebroid stophung indefinitely when disconnecting from a stepped or suspended target application on Android ART. Event request tracking is now cleared in-memory without sending blocking JDWP delete requests, suspended threads and the target VM are explicitly resumed upon teardown to keep the app responsive, a 15s timeout safeguard is configured on theSocketAttachJDI connector, CLI socket communication timeouts are added, and step execution requests are updated toSUSPEND_ALLwithresumeAll()to prevent deadlocks (#65). - Hang in Command Runner on Stream Reading: Fixed a potential hang in
DefaultCommandRunnerwhere process standard output was read synchronously before checking process timeout, causing CLI execution to block indefinitely if a subprocess stalled without closing its output stream (#55). - Threads Command Schema and Type Mismatch: Fixed schema descriptor and response format for
debroid threads <session_id>. Replaced numeric status codes and snake_case strings with strongly-typedThreadInfoandCliThreadInfomodels featuring camelCase properties (threadId,threadName,status,isSuspended) and a typedThreadStatusenum (RUNNING,SLEEPING,WAIT,MONITOR,NOT_STARTED,ZOMBIE,UNKNOWN) (#54). - App Startup Breakpoint Catching: Fixed an issue where
debroid launchreturned before the VM was actually suspended (suspendedThreadsCount: 0), causing Android to finish startup execution before breakpoints could be set. The VM is now suspended immediately upon connection by default (#43).
v0.1.0
Added
- State-Based Auto-Update Synchronization: The CLI now maintains a version cache (
~/.debroid/update-cache.json) to track its execution state. Upon detecting a binary update, it will automatically extract the bundledSKILL.mdto~/.debroid/skills/debroid-cli/SKILL.mdand synchronously alert AI agents to re-read their symlinked instructions by returning aCLI_UPDATEDJSON error. - Daemon Version Handshake: The background daemon now supports a
GetVersionprotocol. The CLI pings this before executing commands to detect stale daemons left running after a binary update, returning aVERSION_MISMATCHJSON error to instruct agents to safely restart the daemon viadebroid stop. - Points Command: Introduce
debroid pointsto list all active debug hooks (breakpoints, watchpoints, and exception points) for an ongoing session to maintain agent state awareness (#37, #36).
Changed
- Removed
debroid skillCommand: The CLI command to print raw skill instructions tostdouthas been removed. AI agents are now instructed viaREADME.mdto symlink their internal skills directly to the auto-extracted file (~/.debroid/skills/debroid-cli/SKILL.md), significantly reducing token bloat and maintaining synchronization. - CLI Error Codes Isolation: Removed CLI-specific error codes (e.g.
VERSION_MISMATCH,CLI_UPDATED) from the core JDIErrorCodedefinitions, moving them to a dedicatedCliErrorCodeenum within the CLI module to enforce clean architectural boundaries. - Reduced Inspection Noise: Filter
staticandsyntheticfields by default during deep object inspection and prevent useless recursion into terminal types. This drastically reduces JSON output size (~30x reduction) to save LLM context tokens (#33, #30). - Documentation: Clarify
objectIdlifecycle and reuse guarantees inSKILL.mdso agents know nested IDs can be reused as long as the VM is suspended (#32, #29).
Fixed
- Ghost Sessions & Disconnect Leaks: Deduplicate
JdiSessionManagerattachments byappIdto prevent duplicate JDWP socket connections. Consolidate session teardown to prevent stale requests and memory leaks after unexpected disconnects (#40, #34). - Duplicate Event Requests: Implement deduplication and upsert logic for breakpoints, exception points, and watchpoints. Trying to create an identical debug hook now safely returns the existing ID or upserts the parameters instead of spawning duplicate requests in the VM (#39, #35).
- Expression Evaluation for Variables: Overhaul the
set-varmutation engine to useJdiExpressionEvaluator. String variables and complex types are now evaluated as pure Java expressions (with primitive coercion) rather than relying on brittle raw string parsing (#31, #28). - Deferred Exception Breakpoints: Fix exception class filtering which previously failed if the target class wasn't yet loaded by the VM. Exceptions are now deferred until the class is prepared. Also clarified Android-specific behavior around uncaught exceptions (#27, #22).
- Nested Object Inspection: Cache
ObjectReferenceproxies globally during suspension so nested object IDs revealed via--max-depthcan be successfully queried in standaloneinspectcalls later (#26, #21). - Early Breakpoint Registration: Mitigate an Android ART bug where breakpoints registered before the first VM resume were silently ignored. The CLI now automatically re-arms early requests upon the first resume (#25, #19).
v0.0.1
What's Changed
- perf: optimize breakpoint resolution with targeted --package parameter by @PatilShreyas in #1
- chore: Downgrade Java requirement to 11 for wider compatibility by @PatilShreyas in #2
- fix: clear cumulative suspend counts and fix resume semantics (H10, H19) by @PatilShreyas in #3
- docs: Revamp README.md for open-source release by @PatilShreyas in #4
- fix: Remove unused condition field from breakpoints (H11) by @PatilShreyas in #5
- ci: Use v{version} as release name by @PatilShreyas in #6
- feat: Add remote binary install and auto-detection to install.sh by @PatilShreyas in #7
- feat: embed SKILL.md into CLI binary and add skill installation paths to README by @PatilShreyas in #8
- docs: Add AI agent prompt tip box and simplify skill setup details in README by @PatilShreyas in #9
- feat(cli): optimize JSON output with compact default and optional --pretty flag by @PatilShreyas in #10
- feat(cli): add type-safe --schema flag, golden schema tests, and @SerialDescription annotations by @PatilShreyas in #11
- perf(core): optimize package-scoped breakpoint binding fallback (15.5x speedup) with unit tests by @PatilShreyas in #12
- chore(ci): modernize CI/release workflows, user-local installer, and uninstallation docs by @PatilShreyas in #13
- feat(cli): add silent auto-updating, 'debroid update' subcommand, and clean update package by @PatilShreyas in #14
- fix(test): prevent thread leak in JdiSessionTest, allocate 2g heap, and refactor event loop by @PatilShreyas in #15
- Add feedback reporting details in the skill by @PatilShreyas in #17
- chore(release): bump version to 0.0.1 for official public release by @PatilShreyas in #16
New Contributors
- @PatilShreyas made their first contribution in #1
Full Changelog: v0.0.1-rc01...v0.0.1