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

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Tue Jan 19 19:04:32 UTC 2016


Hi Yasumasa,

This looks pretty good.
Thank you for the enhancement!

A couple of minor comments.

src/share/vm/prims/jvmtiExport.cp

+jint JvmtiExport::load_agent_library(const char *agent, const char 
*absParam,
+ const char *options, outputStream* st) {


The indent needs to be corrected.

test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java

The indent is not consistent:

   50             throw new RuntimeException(
   51                     "System property 'test.jdk' not set. " +
  . . .
   61             throw new FileNotFoundException(
   62                                   "Could not find " + libpath.toAbsolutePath());


I do not need to see another webrev if you resolve the indent comments. 
Thanks, Serguei On 1/19/16 05:19, 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(). 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> 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) 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20160119/01e6aa53/attachment.html>


More information about the serviceability-dev mailing list