RFR: 8325945: Error reporting should limit the number of String characters printed

Thomas Stuefe stuefe at openjdk.org
Wed Jul 17 05:27:53 UTC 2024


On Fri, 12 Jul 2024 02:17:46 GMT, David Holmes <dholmes at openjdk.org> wrote:

> Please review this enhancement that intends to improve the readability of error logs when very long `java.lang.String`s exist and when printed in full they obscure things in the log.
> 
> The suggestion was to add a `MaxStringPrintSize` flag, similar to the `MaxElementPrintSize` for arrays. I've set the default to 256 (arbitrary selection: not too big, not too small - may need adjusting) with a range from 2 to O_BUFLEN.
> 
> The method `java_lang_String::print` now takes a `max_length` parameter that defaults to `MaxStringPrintSize`. This allows more direct control if specific call sites want to print full strings regardless.
> 
> If a string's length exceeds `max_length` then we print it as follows:
> 
> "< first max_length/2 characters> ... <last max_length/2 characters>" (abridged)
> 
> For example if we print "ABCDE" with a max_length of 4 then the output is literally:
> 
> "AB ... DE" (abridged)
> 
> The message doesn't mention `MaxPrintStringSize` as that may not be involved in limiting the printed length. Developers will need to know to look at that (which is not 100% satisfactory but explaining everything in the output itself seems a bit excessive).
> 
> For testing purposes I added a WhiteBox API to print the string to a `stringStream` and then return it as a new `java.lang.String`.
> 
> Testing:
>  - new test added for validation purposes
>  - tiers 1 - 3 as sanity testing
> 
> Thanks

src/hotspot/share/classfile/javaClasses.cpp line 785:

> 783:       index = length - (max_length / 2);
> 784:       abridge = false; // only do this once
> 785:     }

Instead of the trailing "abridged", in similar cases I printed out the number of omitted characters. E.g.

"Very long long long ... (53 characters omitted) ... long long string"

Makes it obvious how much has been cut, and no danger of confusing the ellipse with naturally occurring dots.

Additionally, I would only do this if length > max_length + X, with X being at least as long as the middle part (3 characters if you only print an ellipse). You end up with printed strings that may be slightly longer than maxlen, but OTOH the output is clearer. Otherwise you may indicate omission where none happened (if length == max_length)

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/20150#discussion_r1680421675


More information about the hotspot-dev mailing list