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

Reply via email to