- LDEV-6339: native-mode debugger polish (all sub-items are native-only unless noted):
- Variables panel no longer ClassCastExceptions when expanding a Component — only agent-mode
ComponentImplhasComponentScopeMarkerTraitShimmixed in via bytecode; the native cast is now gated byinstanceof - Variables panel honours VSCode's
start/countpagination request and reportsindexedVariables/namedVariablesso large arrays and structs are chunked instead of streamed in one shot (both modes) - Debug console accepts expressions without a selected frame — evaluates against any suspended
PageContextinstead of returning "missing frameID" (native only; agent's no-frame eval returns the "not paused" default) - Expanding a Component now splits into
this/variables/static/functions/accessorssub-groups (empty groups omitted); thefunctionsandaccessorsgroups render full signatures derived fromgetMetaData(cfc)(auto-generated accessors derived from the property declaration). Agent mode expands to a flat list with noisy UDFs filtered. - Variables panel exposes additional scopes:
cookie,cfthread,applicationContext,systemMetrics
- Variables panel no longer ClassCastExceptions when expanding a Component — only agent-mode
- LDEV-6337 (native only — Lucee 7.1+): Variables panel now shows the right
variablesscope on top-level CFM pages (was missing entirely) and inside custom-tag bodies (was leaking the caller's scope). Core fix on the INCLUDE debugger frame; existing specs for top-level CFM, cfmodule, and top-level exception-suspend now pass once the minimum core picks up the fix.
- Minimum Lucee core version raised to 7.1.0.134
- LDEV-6335: native step-over now advances by source line rather than by ExecutionLog instrumentation block — multi-expression lines (e.g.
<cfset c = a & b>) no longer require two clicks to advance past - LDEV-6334: stale frame IDs after step/continue resolve to the owning request's live
PageContextviarequestIdmatching, so racing VSCode requests no longer return "Frame not found" or blank the Variables panel
- Minimum Lucee core version raised to 7.1.0.132
- LDEV-6309:
StackOverflowErrorwhen inspecting variables containing self-referential structs.ValTracker.wrapperByObjnow uses identity-keyed weak references instead ofWeakHashMap, so registering an object no longer triggersStructImpl.hashCode()'s value-walk on cyclic graphs.
- LDEV-6274: cfinclude frames now surface the included file's basename as the frame name, not the enclosing UDF's file
- Native: HTML dump/dumpAsJSON crash caused by
DEFAULT_RICHtypo in native path - Native: DAP completions now suggest local + arguments scope variables
- Native: function breakpoint
stoppedevent now reports reason"function breakpoint"; emptysetFunctionBreakpointsresponse body; line-0 UDF frame included on function-entry suspend - Native: custom DAP requests (e.g.
getApplicationSettings) now routed to the currently-suspended PageContext; frame cache evicted per-thread on resume - Native:
exceptionInforesponse now surfaces the CFML exception type - Agent: background threads marked as daemon so they don't block JVM shutdown
- Bytecode transform failures now load un-instrumented class instead of killing the JVM
System.exitcall sites replaced with logging + continue — debugger can no longer crash the host JVM- BIF calls in native mode use
ClassUtil.loadBIFwith short name, not full class path
- Minimum Lucee core version raised to 7.1.0.100 (required for native exception breakpoints)
- Refactored
NativeLuceeVmfrom reflection to loader API throughout - Removed
Utils.terminate/Utils.unreachableJVM-killers - Removed hot-path debug
printlnspam from agent mode
- LDEV-6282: Native-mode uncaught-exception breakpoints — debugger suspends on unhandled exceptions across cfm top-level, component methods, closures, cfthread join (throwOnError), and parallel arrayEach
- Exception breakpoints now work in native mode (Lucee 7.1+) - Fixed critical bug where onException() was never called for uncaught exceptions. Added onException() call in Lucee's PageContextImpl.java execute() catch block.
- Docker example .lco file deployment - Fixed COPY path in Dockerfile to correctly reference files from build context
- Log prefix changed from
[luceedebug]to[debugger]for consistency - Exception logging now defaults to
true(wasfalse) - exception details are lost after continuing, so logging them makes sense - Console output streaming now defaults to
true(wasfalse) - it's a debug tool, DX matters more than a bit of overhead - onException() calls now log at DEBUG level instead of INFO - reduces noise in debug console
- Test infrastructure for exception logging configuration (logLevel and logExceptions parameters)
- Three new tests for exception logging behavior:
- testExceptionLoggingWithLogExceptionsEnabled
- testExceptionLoggingDisabled
- testOnExceptionCalledLogsAtDebugLevel
- Diagnostic logging from isDapClientConnected() - simplified to just return the boolean flag
- Reduced client logging verbosity for cleaner debug output
- Improved Docker example documentation with detailed logging explanations
- Documentation for
LUCEE_DEBUGGER_DEBUGenvironment variable for verbose server-side logging - IDE integration tips for Neovim and JetBrains in Docker example README
- Docker example - Complete working example with Lucee 7.1 in Docker, includes VS Code, Neovim, and JetBrains configurations
LUCEE_DAP_HOSTenvironment variable for binding DAP server to specific addresses (default: localhost, use0.0.0.0for Docker)- Maven Central publishing support in CI/CD
- AGENTS.md documentation for building from source
- Migrated from Gradle to Maven build system
- VS Code extension migrated to lucee publisher for Marketplace release
- Updated tests to use published Lucee 7.1 alpha instead of custom builds
- .lex deployment with correct GAV (Group-Artifact-Version) in manifest
- CI deploy job GPG configuration