>From your original post "The exception is only thrown under 64bit Linux Server-VM, within tomcat. It is neither thrown under 64bit Windows, nor on the very same Linux VM as standalone testcase, nor when a debugger is remotely attached. "
Sounds like you're saying it only happens within Tomcat, sooo..... kinda would seem version(s) of tomcat this has manifested itself within would be helpful for those debugging to have exact same environment from which to try and replicate the *bug. Either you misposted or I'm misunderstanding. Either way, I have same environment, I'll try and reproduce. On Mon, Aug 30, 2010 at 4:01 PM, Steffen Heil <li...@steffen-heil.de> wrote: > Hi > > > What version tomcat? > > I see this under 6.0.29 [and I think under 6.0.18 before, but I am not > sure], but as this is pure java code, not calling any tomcat code and not > probably affected by tomcat code, I don't think that matters. (That's why I > labeled that off-topic.) > > However, if it even could be of any help solving this mystery, I will > provide any information needed. > > Regards, > Steffen > > > > > > > On Mon, Aug 30, 2010 at 3:38 PM, Steffen Heil <li...@steffen-heil.de> > wrote: > > > > > Hi > > > > > > I am sorry, I am asking something not really related to tomcat here. > > > While this may sound like a beginners question, I think I really what > > > I am doing in java, but this time I suspect I have found a scenario > > > where the sun/oracle VM exposes a bug with pure String handling. > > > > > > So anyone who can find a bug in the procedure posted below is very > > welcome. > > > So is everyone who can direct me to some place better suited to ask > > > this question. > > > > > > Finding bugs in a static method that only takes immutable arguments > > > usually seems easy... Turns out, it is not. > > > > > > However, please note that I already tried to debug this in various > > > ways and the exception does NOT occur, as soon as a debugger is > > > attached. The exception is only thrown under 64bit Linux Server-VM, > > > within tomcat. It is neither thrown under 64bit Windows, nor on the > > > very same Linux VM as standalone testcase, nor when a debugger is > > > remotely attached. The JREs testest are 1.6u20 and 1.6u21. > > > > > > The code in question is the following: > > > > > > > > > @SuppressWarnings( "null" ) > > > public final static String replaceAll( String stack, String ... > > > replacements ) > > > { > > > try { > > > if ( stack == null ) > > > return stack; > > > int index, pos; > > > String niddle = null, string; > > > int niddleLength, stringLength; > > > for ( index = 0; true; index += 2 ) { > > > if ( index >= replacements.length ) > > > return stack; > > > niddle = replacements[ index ]; > > > pos = stack.indexOf( niddle ); > > > if ( pos != - 1 ) > > > break; > > > } > > > StringBuilder buffer = new StringBuilder( stack > ); > > > niddleLength = niddle.length(); > > > string = replacements[ index + 1 ]; > > > if ( string == null ) > > > do > > > buffer.delete( pos, pos + > > > niddleLength ); > > > while ( ( pos = buffer.indexOf( niddle, > > > pos > > > ) ) != - 1 ); > > > else { > > > stringLength = string.length(); > > > do { > > > /*331*/ buffer.replace( pos, pos + > niddleLength, > > > string ); > > > pos += stringLength; > > > } while ( ( pos = buffer.indexOf( > > > niddle, pos ) ) != - 1 ); > > > } > > > index += 2; > > > for ( ; index < replacements.length; index += 2 > ) > { > > > niddle = replacements[ index ]; > > > string = replacements[ index + 1 ]; > > > niddleLength = niddle.length(); > > > if ( string == null ) > > > for ( pos = 0; ( pos = > > > buffer.indexOf( niddle, pos ) ) != - 1; ) > > > buffer.delete( pos, pos > > > + niddleLength ); > > > else { > > > stringLength = string.length(); > > > for ( pos = 0; ( pos = > > > buffer.indexOf( niddle, pos ) ) != - 1; pos += stringLength ) > > > buffer.replace( pos, > > > pos + niddleLength, string ); > > > } > > > } > > > return buffer.toString(); > > > } catch ( Throwable t ) { .... (code to dump the > > > arguments and the stack trace) ... > > > } > > > } > > > > > > > > > Note, that when the method is called, there are two arguments: one > > > String and a String[] with a length of 1004 Strings.... (I guarantee > > > that this String array is NOT modified during execution, not even > > > afterwards.) The execption is (it is thrown indirectly in the marked > line 331): > > > > > > java.lang.StringIndexOutOfBoundsException: start > length() > > > at > > > java.lang.AbstractStringBuilder.replace(AbstractStringBuilder.java:799) > > > at java.lang.StringBuilder.replace(StringBuilder.java:271) > > > at > > > com.osiris4.core.utils.StringUtils.replaceAll(StringUtils.java:331) > > > .... > > > > > > > > > I can provide real arguments that lead to this exception, however, as > > > there are more than 1000 Strings (partially large ones) involved, I > > > will skip them here. > > > Anyone interested will get them by mail. I have various samples. > > > > > > > > > Currently this prevents loading my web application in about one of > > > three times. (And it also happens during internal computations which > > > prevents further work.) Sometimes this error can be "reproduced" (by > > > restarting > > > tomcat) 10 times in a row, sometimes it does not occur within 20 > > > restarts at all. (Without changing anything in the systems > > > configuration.) > > > > > > > > > Sorry again, for asking off-topic, but I don't know where to ask for > > > help anymore. > > > > > > Regards, > > > Steffen > > > > > > >