Skip to content

Fix Save Value to File for large debugger strings (#9452) - #9534

Open
kamilkrzywanski wants to merge 2 commits into
apache:masterfrom
kamilkrzywanski:fix-9452-save-value-to-file
Open

kamilkrzywanski wants to merge 2 commits into
apache:masterfrom
kamilkrzywanski:fix-9452-save-value-to-file

Conversation

@kamilkrzywanski

Copy link
Copy Markdown
Contributor

Summary

  • Keep shortened-string metadata in a strong HashMap so getShortenedInfo() still resolves after GC (previously a WeakHashMap could drop the entry while the truncated ... display value was still shown).
  • Also resolve quoted Variable.getValue() forms ("content...") when looking up shortened info.
  • Fixes Save Value to File writing only the first 100k characters plus ... instead of streaming the full remote string via StringInfo.getContent().

Fixes #9452

Test plan

  • Debug an app with a String larger than 100_000 characters
  • Open the variable custom editor (...) and choose Save Value to File
  • Confirm the saved file length matches the full string (no trailing truncation ellipsis)

Standalone verification of the lookup failure mode:

  • With WeakHashMap, after GC of the map key, lookup of an equal display string returns null → save would write the truncated preview
  • With HashMap, lookup still succeeds → save can use getContent()

Keep shortened-string metadata in a strong map and resolve quoted
Variable.getValue() forms so Save can stream the full remote content
instead of the truncated 100k+"..." preview.
public final class ShortenedStrings {

private static final Map<String, StringInfo> infoStrings = new WeakHashMap<String, StringInfo>();
private static final Map<String, StringInfo> infoStrings = new HashMap<String, StringInfo>();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the reason to switch from WeakHashMap to HashMap. The full strings are looked up by a string and if the key goes out of scope it makes sense, that the referenced value is removed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@matthiasblaesing the WeakHashMap key is the shortened display string. Lookup often uses a different String instance (or a quoted Variable.getValue() form), so the entry can disappear while the UI still shows the truncated value and Save only writes that preview.

HashMap keeps it for the session; we still clear on last session remove. Also added quoted-form lookup.

Explain that WeakHashMap drops entries when the UI holds a different
String instance (or quoted Variable.getValue form) than the map key.

Signed-off-by: Kamil Krzywanski <kamilkrzywanski01@gmail.com>
@mbien mbien added Java [ci] enable extra Java tests (java.completion, java.source.base, java.hints, refactoring.java, form) ci:dev-build [ci] produce a dev-build zip artifact (7 days expiration, see link on workflow summary page) debugger labels Aug 27, 2026
@matthiasblaesing

matthiasblaesing commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

@kamilkrzywanski sorry for the late reply. I looked into this and while the changes improve the situation, it still felt off to me. The core problem for me is: Using string prefixes as keys for the full string. This is prone to collisions.

I stepped back and considered the situation from a different perspective: for short string we don't need special handling as the value itself can be fetched and we are done. Caching the strings can help performance though. Special casing is only needed for the long strings and for these the approach suggested by #9635 is to return a special object StringInfo that holds the shortened string and all the data that is required to fetch the full string.

Would you mind having a look at #9635 and test that approach? The nightly build is available from: https://github.com/apache/netbeans/suites/97240182404/artifacts/10773115996 (or via the checks page of the PR)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci:dev-build [ci] produce a dev-build zip artifact (7 days expiration, see link on workflow summary page) debugger Java [ci] enable extra Java tests (java.completion, java.source.base, java.hints, refactoring.java, form)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

"Save Value to File" if > 100kB broken

3 participants