Hi Yasumasa,
On 7/06/2018 10:43 PM, Yasumasa Suenaga wrote:
Hi all,
Please review this change:
webrev:
http://cr.openjdk.java.net/~ysuenaga/JDK-8204531/webrev.00/
JBS:
https://bugs.openjdk.java.net/browse/JDK-8204531
We can use `jhsdb jsnap` to check all PerfData.
String values in PerfData are defined as jbyte array, but JSnap cannot
handle it well as following:
```
$ jhsdb jsnap --pid 28542 --all | less
sun.gc.cause=No
GC^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
```
You can see this value via `less` and `vim` on Linux. `^@` shows it is
non-ascii character.
So your synopsis says "remove unused chars following \0". Is that really
what is happening? I would have expected "new String(bytes, encoding)"
to stop processing bytes when it encounters a NUL!
PerfDataEntry has null-terminated C string. So we should restore as it
in Java layer.
If the issue is really "junk" beyond the \0 nul-terminator, how did we
get such values? Shouldn't the byte array already be terminated at the
NUL? Or is this just a raw representation of an array in the VM using
the exact length of the array regardless of content?
I see CStringUtilities.getString() both stops when it encounters a 0
value, and uses the default file encoding (else ASCII).
The fix seems perfectly reasonable, I'm just unclear where exactly this
"bad" data should have been stopped.
Thanks,
David
Thanks,
Yasumasa