Hi David, Thank you for your comment.
I removed the assertion from PerfDataEntry.java . Could you review again? http://cr.openjdk.java.net/~ysuenaga/JDK-8204531/webrev.03/ Thanks, Yasuamsa 2018-06-14 13:41 GMT+09:00 David Holmes <david.hol...@oracle.com>: > Hi Yasumasa, > > This seems mostly okay - though like Thomas this is not an area I'm that > familiar with. But it seems this addresses the problem without impacting > other things. > > This assert is redundant: > > 366 if (Assert.ASSERTS_ENABLED) { > 367 Assert.that(vectorLength() > 0, "not a byte > vector"); > > You can't reach it unless len != 0 and I assume you're not really checking > that len is not-negative - if you are then the assert needs to go further up > after: > > 328 int len = vectorLength(); > > Thanks, > David > > > On 14/06/2018 2:18 PM, Yasumasa Suenaga wrote: >> >> Hi Thomas, >> >> Thank you for your comment. >> I uploaded new webrev: >> >> http://cr.openjdk.java.net/~ysuenaga/JDK-8204531/webrev.02/ >> >> >> 2018-06-14 3:34 GMT+09:00 Thomas Stüfe <thomas.stu...@gmail.com>: >>> >>> Hi Yasumasa, >>> >>> looks good to me. >>> >>> small nit: >>> import java.nio.charset.* -> import java.nio.charset.Charset; >> >> >> Fixed. >> >> >>> We loose the assert for type now from byteArrayValue(). Can you re-add >>> it to the location where you call CStringUtils? >> >> >> I added the assertion to check vector length. >> I did not add type assertion because if-statement branches by data type. >> >> >>> We do not seem to need byteArrayValue(), can this be removed? >> >> >> I cannot agree that. >> byteArrayValue() is public method (but it is not used AFAICS). >> However, similar getter methods are privided from PerfDataEntry (e.g. >> charArrayValue()). So I think we should not remove byteArrayValue(). >> >> >> Regards, >> >> Yasumasa >> >> >>> Best Regards, Thomas >>> >>> >>> >>> On Wed, Jun 13, 2018 at 3:33 PM, Yasumasa Suenaga <yasue...@gmail.com> >>> wrote: >>>> >>>> Thanks Thomas, >>>> >>>>> That said, I'd probably just add a variant to >>>>> CStringUtilities::getString which takes encoding as an argument, and >>>>> then pass "US-ASCII" to remain compatible with the current version of >>>>> jsnap. >>>> >>>> >>>> >>>> I agree with you. My opinion is one of the ideals. >>>> Anyway, I uploaded new webrev which is added charset support in >>>> CStringUtils: >>>> >>>> http://cr.openjdk.java.net/~ysuenaga/JDK-8204531/webrev.01/ >>>> >>>> >>>> Thanks, >>>> >>>> Yasumasa >>>> >>>> >>>> >>>> On 2018/06/13 21:46, Thomas Stüfe wrote: >>>>> >>>>> >>>>> Disclaimer: I am Reviewer but not versed in this corner of the jdk, >>>>> nor have knowledge of the history, so take what I suggest with a grain >>>>> of salt. >>>>> >>>>> That said, I'd probably just add a variant to >>>>> CStringUtilities::getString which takes encoding as an argument, and >>>>> then pass "US-ASCII" to remain compatible with the current version of >>>>> jsnap. >>>>> >>>>> ..Thomas >>>>> >>>>> On Wed, Jun 13, 2018 at 2:37 PM, Yasumasa Suenaga <yasue...@gmail.com> >>>>> wrote: >>>>>> >>>>>> >>>>>> Hi Thomas, >>>>>> >>>>>> Thank you for your comment. >>>>>> >>>>>> CStringUtilities.java says the String which is constructed from byte >>>>>> array >>>>>> should use Charset.defaultCharset(). [1] >>>>>> I'm not convinced how should we fix - US-ASCII or default charset. >>>>>> >>>>>> IMHO we should use default charset. However I concern I need to get >>>>>> CSR >>>>>> approvement. >>>>>> (In addition, I want to refactor CStringUtilities. I guess we can make >>>>>> more >>>>>> simple code :-) >>>>>> >>>>>> >>>>>> What do you think about it? >>>>>> >>>>>> Yasumasa >>>>>> >>>>>> >>>>>> [1] >>>>>> >>>>>> >>>>>> http://hg.openjdk.java.net/jdk/jdk/file/7bf4f1b5e438/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/CStringUtilities.java#l73 >>>>>> >>>>>> >>>>>> >>>>>> On 2018/06/13 21:18, Thomas Stüfe wrote: >>>>>>> >>>>>>> >>>>>>> >>>>>>> Hi Yasumasa, >>>>>>> >>>>>>> your patch will change behavior of jsnap if file.encoding is set to >>>>>>> something different than US-ASCII. >>>>>>> >>>>>>> Old version uses, hard wired, US-ASCII. >>>>>>> >>>>>>> You now use jvm/hotspot/utilities/CStringUtilities.java, which uses >>>>>>> >>>>>>> private static String encoding = System.getProperty("file.encoding", >>>>>>> "US-ASCII"); >>>>>>> >>>>>>> and thus may use a different encoding. >>>>>>> >>>>>>> Best Regards, Thomas >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Wed, Jun 13, 2018 at 2:09 PM, Yasumasa Suenaga >>>>>>> <yasue...@gmail.com> >>>>>>> wrote: >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> PING: Could you review it? >>>>>>>> I want to merge this change before JDK 11 RDP 1. >>>>>>>> >>>>>>>>>>> webrev: >>>>>>>>>>> >>>>>>>>>>> http://cr.openjdk.java.net/~ysuenaga/JDK-8204531/webrev.00/ >>>>>>>>>>> >>>>>>>>>>> JBS: >>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8204531 >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Yasumasa >>>>>>>> >>>>>>>> >>>>>>>> On 2018/06/08 15:38, Yasumasa Suenaga wrote: >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> Hi David, >>>>>>>>> >>>>>>>>> 2018-06-08 10:47 GMT+09:00 David Holmes <david.hol...@oracle.com>: >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 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! >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> String c'tor will continue to parse byte array even if it finds >>>>>>>>> '\0'. >>>>>>>>> You can see it on JShell as below: >>>>>>>>> >>>>>>>>> ------------- >>>>>>>>> jshell> var bytes = new byte[]{(byte)'a', (byte)'b', (byte)'c', >>>>>>>>> (byte)'\0', (byte)'d', (byte)'e', (byte)'f'} >>>>>>>>> bytes ==> byte[7] { 97, 98, 99, 0, 100, 101, 102 } >>>>>>>>> >>>>>>>>> jshell> new String(bytes, "US-ASCII") >>>>>>>>> $2 ==> "abc\000def" >>>>>>>>> ------------- >>>>>>>>> >>>>>>>>> >>>>>>>>>>> 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 think JSnap shows 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! >>>>>>>>> >>>>>>>>> >>>>>>>>> Yasumasa >>>>>>>>> >>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> David >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Thanks, >>>>>>>>>>> >>>>>>>>>>> Yasumasa >>>>>>>>>>> >>>>>>>>>> >>>>>>>> >>>>>> >>>> >