RFR (M) 8067662: "java.lang.NullPointerException: Method name is null" from StackTraceElement.<init>
serguei.spitsyn at oracle.com
serguei.spitsyn at oracle.com
Thu Mar 19 18:37:14 UTC 2015
On 3/19/15 11:11 AM, Daniel D. Daugherty wrote:
> On 3/12/15 11:27 PM, serguei.spitsyn at oracle.com wrote:
>> Please, review the jdk 9 fix for:
>> https://bugs.openjdk.java.net/browse/JDK-8067662
>>
>>
>> Open hotspot webrev:
>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2015/hotspot/8067662-JVMTI-trace.1/
>>
>
> Thumbs up. None of these comments are critical.
Thanks a lot for the review, Dan!
>
>
> src/share/vm/classfile/javaClasses.hpp
> No comments.
>
> src/share/vm/classfile/javaClasses.cpp
>
> line 1316: return method != NULL &&
> (method->constants()->version() == version
> line 1317: && version < MAX_VERSION);
> Don't really need the parens and the indenting implies
> a logical grouping that isn't really there. Perhaps:
>
> return method != NULL && method->constants()->version() ==
> version
> && version < MAX_VERSION;
>
> Although I also wonder why the caller would pass a 'version'
> value that is >= MAX_VERSION. Perhaps this instead:
>
> assert(version < MAX_VERSION, "version is too big");
> return method != NULL && method->constants()->version() ==
> version
>
> line 1347: typeArrayOop _cprefs;
> Perhaps add a comment: // needed to insulate method name
> against redefinition
>
> line 1486: holder = holder->get_klass_version(version); // Use
> specific ik version as a holder
> Perhaps the following comment instead:
>
> // Use specific ik version as a holder since the mirror might
> // refer to version that is now obsolete.
>
> I'm not sure "obsolete" is the right term here, but say
> something about why the mirror version is not good enough.
>
> Update: 'obsolete' is the right term now that I've re-read the
> code review invite! Perhaps this is better:
>
> // Use specific ik version as a holder since the mirror might
> // refer to version that is now obsolete and no longer accessible
> // via the previous versions list.
>
> line 1854: // Get method id, cpref, bci, version and mirror from
> chunk
> Perhaps:
>
> // Get method id, bci, version, mirror and cpref from chunk
>
> since that's the order you do the work...
>
> line 1909: holder = holder->get_klass_version(version); // Use
> specific ik version as a holder
> Similar comment as on line 1486.
>
> src/share/vm/oops/instanceKlass.hpp
> No comments.
>
> src/share/vm/oops/instanceKlass.cpp
> No comments.
>
>
>> Open webrev for unit test update:
>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2015/jdk/8067662-JVMTI-trace-test.1/
>>
>
> test/java/lang/instrument/RedefineMethodInBacktrace.sh
> No comments.
>
> test/java/lang/instrument/RedefineMethodInBacktraceApp.java
> line 175: System.exit(1);
> A comment to explain why this test needs to exit on
> failure would be good. When the work to get rid of
> shell script driven tests gets here, it would be
> useful for understanding why this test must be
> standalone.
All of the above suggestions are good.
Will update before the push.
Thanks!
>
> test/java/lang/instrument/RedefineMethodInBacktraceTarget.java
> No comments.
>
> test/java/lang/instrument/RedefineMethodInBacktraceTargetB.java
> No comments.
>
> test/java/lang/instrument/RedefineMethodInBacktraceTargetB_2.java
> No comments.
>
> test/java/lang/instrument/RedefineMethodInBacktraceTarget_2.java
> No commetns.
>
Thanks!
Serguei
>
> Dan
>
>
>>
>>
>> Summary:
>> An NPE is trown in a thread dumping via JMX when doing CPU
>> profiling in NetBeans Profiler and VisualVM.
>> The issue is that the methods and related klass versions are not
>> kept alive if a class redefinition
>> takes place between catching a Throwable and taking a thread dump.
>> It can result in loosing an obsolete method, and so, the
>> reconstruction of method name becomes impossible.
>> In such a case, the null reference is returned instead of a valid
>> method name.
>>
>> The solution is to use current klass version and method orig_idnum
>> instead of ordinary method idnum
>> to find required method pointer. In the worst case when the related
>> klass version is gone
>> (was not included to or was removed from the previous_versions
>> linked list), a saved method name
>> CP index of the latest klass version can be used to restore the
>> method name.
>> The footprint extra overhead for this approach is u2 per stack frame.
>>
>> The plan is also to backport the fix to 8u60.
>>
>> Testing:
>> In progress: nsk redefine classes tests, JTREG java/lang/instrument
>>
>>
>> Thanks,
>> Serguei
>>
>>
>
More information about the serviceability-dev
mailing list