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 > > > >
smime.p7s
Description: S/MIME cryptographic signature