David, > Ignoring Dmitry's issue it still seems simpler/cleaner to just add the > desired precision value to the %s than to split into two print > statements. Or bite the bullet now and make the length immaterial by > breaking the name into chunks. It's as easy to fix as to write the > RFE :)
For this particular case the simplest solution is to use print_raw: print_raw("\""\"); print_raw(get_thread_name()); print_raw("\""\"); But as soon as print() finally ends up with: const int written = vsnprintf(buffer, buflen, format, ap); ... DEBUG_ONLY(warning("increase O_BUFLEN in ostream.hpp -- output truncated");) Complete fix should be something like: int desired_size = vsnprintf(NULL, 0, format, ap); if (desired_size > O_BUFLEN) { malloc .... } but it has performance penalty, so we should use some tricks to cover most common %s/%d/%p cases. -Dmitry On 2016-03-18 15:51, David Holmes wrote: > On 18/03/2016 10:03 PM, Cheleswer Sahu wrote: >> Hi David, >> >> -----Original Message----- >> From: David Holmes >> Sent: Friday, March 18, 2016 2:42 PM >> To: Cheleswer Sahu; hotspot-runtime-...@openjdk.java.net; >> serviceability-dev@openjdk.java.net >> Subject: Re: RFR[9u-dev]: 8151442: jstack doesn't close quotation >> marks properly with threads' name greater than 1996 characters >> >> On 18/03/2016 5:54 PM, Cheleswer Sahu wrote: >>> Hi, >>> >>> Please review the code changes for >>> https://bugs.openjdk.java.net/browse/JDK-8151442. >>> >>> Webrev Link: http://cr.openjdk.java.net/~csahu/8151442/ >>> >>> Bug Brief: >>> >>> In jstack thread dumps , thread name greater than 1996 characters >>> doesn't close quotation marks properly. >> >> Anyone giving a thread a name that long deserves to get a core dump! ;-) >> >>> Problem Identified: >>> >>> Jstack is using below code to print thread name >>> >>> src/share/vm/runtime/thread.cpp >>> >>> void JavaThread::print_on(outputStream *st) const { >>> >>> st->print("\"%s\" ", get_thread_name()); >>> >>> Here "st->print()" internally uses max buffer length as O_BUFLEN >>> (2000). >>> >>> void outputStream::do_vsnprintf_and_write_with_automatic_buffer(const >>> char* format, va_list ap, bool add_cr) { >>> >>> char buffer[O_BUFLEN]; >>> >>> do_vsnprintf_and_write_with_automatic_buffer() finally calls >>> "vsnprintf()" which truncates the anything greater than the max >>> size(2000). In this case thread's name(> 1996) along with quotation >>> marks (2) >>> >>> plus one terminating character exceeds the max buffer size (2000), >>> therefore the closing quotation marks gets truncated. >>> >>> Solution: >>> >>> Split the "st->print("\"%s\" ", get_thread_name())" in two statements >>> >>> 1.st->print("\"%s", get_thread_name()); >>> >>> 2.st->print("\" "); >>> >>> This will ensure presence of closing quotation mark always. >> >> Can't we just limit the number of characters read by %s? >> >> Yes we can do it, but just one thing which I think of is, if the >> truncation of output inside output stream issue get resolves as >> Dmritry suggested or O_BUFFLEN size gets increased in any future fix >> then we have to again make changes in this code, as limiting the no. >> of character read by %s will give truncated output . In such case >> present fix will have no effect. > > Ignoring Dmitry's issue it still seems simpler/cleaner to just add the > desired precision value to the %s than to split into two print > statements. Or bite the bullet now and make the length immaterial by > breaking the name into chunks. It's as easy to fix as to write the RFE :) > > David > >> David >> >>> Regards, >>> >>> Cheleswer >>> -- Dmitry Samersoff Oracle Java development team, Saint Petersburg, Russia * I would love to change the world, but they won't give me the sources.