RFR: JDK-8147388: Add diagnostic commands to attach JVMTI agent.

Yasumasa Suenaga yasuenag at gmail.com
Wed Jan 20 09:06:17 UTC 2016


I agree to Dmitry.

Most case of malloc error, native memory is exhausted.
Thus I think process (or system) is illegal state. It should be shut down.
If do not so, malloc failure might be occurred another point.

However, I think that it is very difficult to set the threshold.
If it can be clear, I will make a new webrev.

Thanks,

Yasumasa
2016/01/20 17:03 "Dmitry Samersoff" <dmitry.samersoff at oracle.com>:

> David,
>
> PS:
>  It might be a good to check opt_len for some large enough value (like
> 2048) before allocation attempt and send back a message.
>
> -Dmitry
>
> On 2016-01-20 08:03, David Holmes wrote:
> > On 20/01/2016 9:13 AM, Yasumasa Suenaga wrote:
> >> Hi David,
> >>
> >> ShouldNotReachHere( ) is called at NMTDcmd:
> >>
> http://hg.openjdk.java.net/jdk9/hs-rt/hotspot/file/8fcd5cba7938/src/share/vm/services/nmtDCmd.cpp#l156
> >>
> >
> > Sure but that is more of a debugging check - we never expect to reach
> > that code.
> >
> > Unfortunately I do see some other implicit aborts due to allocation
> > failures, but I have to say this seems very wrong to me.
> >
> > David
> > -----
> >
> >> If target VM is aborted, caller (e.g. jcmd) cannot receive response. I
> >> think that the caller show Exception.
> >>
> >> Thanks,
> >>
> >> Yasumasa
> >>
> >> 2016/01/20 7:37 "David Holmes" <david.holmes at oracle.com
> >> <mailto:david.holmes at oracle.com>>:
> >>
> >>     On 19/01/2016 11:19 PM, Yasumasa Suenaga wrote:
> >>
> >>         Hi,
> >>
> >>         I uploaded a new webrev:
> >>         http://cr.openjdk.java.net/~ysuenaga/JDK-8147388/webrev.03/
> >>
> >>         It is malloc/free version.
> >>         If NULL returns from malloc(), it calls vm_exit_out_of_memory().
> >>
> >>
> >>     That seems rather extreme - do other dcmd failures abort the VM? I
> >>     would have expected some kind of error propagation back to the
> >> caller.
> >>
> >>     Thanks,
> >>     David
> >>
> >>         All test about this changes work fine.
> >>         Please review.
> >>
> >>         Thanks,
> >>
> >>         Yasumasa
> >>
> >>
> >>         On 2016/01/19 22:07, Dmitry Samersoff wrote:
> >>
> >>             David,
> >>
> >>                 Anytime we start to use a language feature for the first
> >>                 time we need
> >>                 to be extra diligent to make sure there are no
> unintended
> >>                 side-effects and that all our supported compilers (and
> >>                 probably a few
> >>                 others used in the community) do the right thing. A bit
> >>                 of googling
> >>                 seems to indicate that variable length arrays are part
> >>                 of C99 but are
> >>                 not allowed in C++ - though gcc has an extension that
> >>                 does allow
> >>                 them.
> >>
> >>
> >>             I hear your concern.
> >>
> >>             Moreover I revisit my advice and think it's not a good idea
> >>             to do a
> >>             stack allocation based on unverified user input.
> >>
> >>             Yasumasa, sorry for leading in wrong direction. Lets use
> >>             malloc/free in
> >>             this case.
> >>
> >>             Nevertheless, I would like to start broader evaluation of
> >>             possible use
> >>             on-stack allocation (either alloca or VLA) - hotspot may
> >>             benefit of it
> >>             in many places.
> >>
> >>             -Dmitry
> >>
> >>             On 2016-01-19 02:06, David Holmes wrote:
> >>
> >>                 On 19/01/2016 7:26 AM, Dmitry Samersoff wrote:
> >>
> >>                     David,
> >>
> >>                     On 2016-01-18 23:47, David Holmes wrote:
> >>
> >>                         On 18/01/2016 11:20 PM, Dmitry Samersoff wrote:
> >>
> >>                             Yasumasa,
> >>
> >>                                 Can we use VLA (Variable Length Arrays)
> ?
> >>
> >>
> >>                             Apple LLVM version 6.1.0 (clang-602.0.53)
> >>                             (based on LLVM
> >>                             3.6.0svn) Target: x86_64-apple-darwin14.5.0
> >>                             Thread model:
> >>                             posix
> >>
> >>                             Compiles it just fine.
> >>
> >>
> >>                         Are we using variable length arrays anywhere
> >>                         else in the VM yet?
> >>
> >>
> >>                     Probably not.
> >>
> >>                     But personally, I see no reason to don't use it for
> >>                     simple cases
> >>                     like this one.
> >>
> >>
> >>                 Anytime we start to use a language feature for the first
> >>                 time we need
> >>                 to be extra diligent to make sure there are no
> unintended
> >>                 side-effects and that all our supported compilers (and
> >>                 probably a few
> >>                 others used in the community) do the right thing. A bit
> >>                 of googling
> >>                 seems to indicate that variable length arrays are part
> >>                 of C99 but are
> >>                 not allowed in C++ - though gcc has an extension that
> >>                 does allow
> >>                 them.
> >>
> >>                 This reports they are not available in Visual Studio
> C++:
> >>
> >>                 https://msdn.microsoft.com/en-us/library/zb1574zs.aspx
> >>
> >>                 David -----
> >>
> >>                         What are the implications for allocation and in
> >>                         particular
> >>                         allocation failure?
> >>
> >>
> >>                     This allocation just reserves some space on the
> >>                     stack[1], so it
> >>                     can cause stack overflow if we attempt to allocate
> >>                     two much bytes.
> >>
> >>
> >>
> >>
> >>                     1. Listing fragment (extra labels are removed)
> >>
> >>                     3                    .Ltext0: 5
> >> .LC0:
> >>
> >>                     14:test.cxx      **** void testme(int n) {
> >>                     15:test.cxx      ****
> >>                     char m[n]; 25 0000 4863FF                movslq
> >>                     %edi, %rdi 28 0003
> >>                     55                    pushq   %rbp 37 0004 BE000000
> >>                     movl    $.LC0, %esi 41 0009 4883C70F
> >>                     addq    $15,
> >>                     %rdi 46 000d 31C0                  xorl    %eax,
> >>                     %eax 50 000f
> >>                     4883E7F0              andq    $-16, %rdi 54 0013
> >> 4889E5
> >>                     movq    %rsp, %rbp 59 0016 4829FC
> >>                     subq    %rdi,
> >>                     %rsp 64 0019 BF010000              movl    $1, %edi
> >>                     65 001e 4889E2
> >>                     movq    %rsp, %rdx 66 0021 E8000000
> call
> >>                     __printf_chk 16:test.cxx      ****   printf("%s",
> >>                     m); 17:test.cxx
> >>                     **** }
> >>
> >>                     -Dmitry
> >>
> >>
> >>
> >>                         David -----
> >>
> >>                             -Dmitry
> >>
> >>                             On 2016-01-18 16:09, Yasumasa Suenaga wrote:
> >>
> >>                                 Hi Dmitry,
> >>
> >>                                     1. It might be better to have one
> >>                                     jcmd to run both java and
> >>                                     native java agent. If agent library
> >>                                     name ends with ".jar"
> >>                                     we can assume it's java agent.
> >>
> >>
> >>                                 Okay, I'll try it.
> >>
> >>                                     if (_libpath.value() == NULL) {
> >>                                     error ... }
> >>
> >>
> >>                                 I will add it. However, I note you that
> >>                                 _libpath is given
> >>                                 mandatory flag.
> >>
> >>
> http://mail.openjdk.java.net/pipermail/serviceability-dev/2016-January/018661.html
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>             char options[option_len];
> >>
> >>
> >>                                 Can we use VLA (Variable Length Arrays)
> >>                                 ? I'm worried that
> >>                                 several C++ compiler cannot compile this
> >>                                 code.
> >>
> >> http://clang.llvm.org/compatibility.html#vla
> >>
> >>
> >>                                 Thanks,
> >>
> >>                                 Yasumasa
> >>
> >>
> >>                                 On 2016/01/18 19:38, Dmitry Samersoff
> >> wrote:
> >>
> >>                                     Yasumasa,
> >>
> >>                                     1. It might be better to have one
> >>                                     jcmd to run both java and
> >>                                     native java agent. If agent library
> >>                                     name ends with ".jar"
> >>                                     we can assume it's java agent.
> >>
> >>                                     2. Please get rid of malloc/free and
> >>                                     check _libpath.value()
> >>                                     for NULL at ll. 295 and below.
> >>
> >>
> >>                                     if (_libpath.value() == NULL) {
> >>                                     error ... }
> >>
> >>                                     if (_option.value() == NULL) {
> >>
> >> JvmtiExport::load_agent_library("instrument",
> >>                                     "false",
> >>                                     _libpath.value(), output());
> >> return; }
> >>
> >>                                     size_t option_len = \
> >>                                     strlen(_libpath.value()) +
> >>                                     strlen(_option.value()) + 1;
> >>
> >>                                     char options[option_len];
> >>
> >>                                     ....
> >>
> >>                                     -Dmitry
> >>
> >>
> >>                                     On 2016-01-15 16:33, Yasumasa
> >>                                     Suenaga wrote:
> >>
> >>                                         Hi,
> >>
> >>                                         I added permissions and tests in
> >>                                         new webrev:
> >>
> >> http://cr.openjdk.java.net/~ysuenaga/JDK-8147388/webrev.01/
> >>
> >>
> >>
> >>             Two tests (LoadAgentDcmdTest, LoadJavaAgentDcmdTest) work
> >> fine.
> >>
> >>
> >>
> >>                                         Thanks,
> >>
> >>                                         Yasumasa
> >>
> >>
> >>                                         On 2016/01/15 17:20, Staffan
> >>                                         Larsen wrote:
> >>
> >>                                             This is a good improvement
> >>                                             overall.
> >>
> >>                                             The new diagnostic commands
> >>                                             need to have proper
> >>                                             permissions set:
> >>
> >>                                             static const JavaPermission
> >>                                             permission() {
> >>                                             JavaPermission p =
> >>
> >> {"java.lang.management.ManagementPermission",
> >>                                             “control", NULL}; return p;
> }
> >>
> >>                                             And as David said: tests!
> See
> >>
> >> hotspot/test/serviceability/dcmd/jvmti.
> >>
> >>                                             Thanks, /Staffan
> >>
> >>                                                 On 14 jan. 2016, at
> >>                                                 15:00, Yasumasa Suenaga
> >>                                                 <yasuenag at gmail.com
> >>
> >> <mailto:yasuenag at gmail.com>>
> >>                                                 wrote:
> >>
> >>                                                 Hi all,
> >>
> >>                                                 We can use Attach API to
> >>                                                 attach JVMTI agent to
> >> live
> >>                                                 process. However, we
> >>                                                 have to write Java code
> >>                                                 for it.
> >>
> >>                                                 If we can attach JVMTI
> >>                                                 agents through jcmd,
> >> it is
> >>                                                 very useful. So I want
> >>                                                 to add two new
> diagnostic
> >>                                                 commands:
> >>
> >>                                                 * JVMTI.agent_load: Load
> >>                                                 JVMTI native agent. *
> >>                                                 JVMTI.javaagent_load:
> >>                                                 Load JVMTI java agent.
> >>
> >>                                                 I maintain two JVMTI
> >>                                                 agents - HeapStats [1]
> >> and
> >>                                                 JLivePatcher [2]. [1] is
> >>                                                 native agent, [2] is
> java
> >>                                                 agent. They provide a
> >>                                                 program for attaching to
> >>                                                 live
> >>                                                 process.
> >>
> >>                                                 I guess that various
> >>                                                 JVMTI agents provide own
> >>                                                 attach
> >>                                                 mechanism like them. I
> >>                                                 think that we should
> >> provide
> >>                                                 general way to attach.
> >>
> >>                                                 I've uploaded webrev.
> >>                                                 Could you review it?
> >>
> >> http://cr.openjdk.java.net/~ysuenaga/JDK-8147388/webrev.00/
> >>
> >>
> >>
> >>             I'm jdk9 committer, however I cannot access JPRT.
> >>
> >>                                                 So I need a sponsor.
> >>
> >>
> >>                                                 Thanks,
> >>
> >>                                                 Yasumasa
> >>
> >>
> >>                                                 [1]
> >>
> >> http://icedtea.classpath.org/wiki/HeapStats
> >>                                                 [2]
> >>
> >> https://github.com/YaSuenag/jlivepatcher
> >>                                                 (in
> >>                                                 Japanese)
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
>
>
> --
> Dmitry Samersoff
> Oracle Java development team, Saint Petersburg, Russia
> * I would love to change the world, but they won't give me the sources.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20160120/dfe911e9/attachment-0001.html>


More information about the serviceability-dev mailing list