Re: [PATCH V2] oprofile-tests Add test to exercise libjvmti_oprofile.so

William Cohen <[email protected]> Thu, 7 Nov 2019 16:33:09 -0500
Newsgroups gmane.linux.oprofile
Message-ID <[email protected]>
On 11/7/19 4:20 PM, willschm wrote:
> On 2019-11-07 14:53, William Cohen wrote:
>> On 10/15/19 2:21 PM, will schmidt wrote:
>>> Hi,
>>>
>>> For V2 of this patch, I have updated the logic that looks for
>>> libjvmti_oprofile.so to also search /usr/lib64/ and /usr/lib/
>>> for the library, stopping when the library is found.  I have
>>> tested a few additional variations locally.
>>>
>>> (V1:)
>>> Assorted changes to exercise the use of oprofiles JVMTI hook.
>>> (libjvmti_oprofile.so  - Java Virtual Machine Tools Interface).
>>>
>>> This has been tested this on assorted ppc64* systems with a mixture
>>> of having the libjvmti_oprofile present and not.
>>>
>>>     testsuite/lib/op_util.exp:
>>>     * Update compile_workload() procedure to allow building of .java files.
>>>     * Add procedure op_resolve_java_dependencies() to ensure that dependencies
>>>       for building and running the java test can be found. This includes java,
>>>       javac, and libjvmti_oprofile.so. Since the libjvmti_oprofile.so object
>>>       can't be readily found via 'which', logic is in place that assumes it can
>>>       be found in a path relative to where the operf binary is found.
>>>
>>>     testsuite/lib/op_workloads.exp:
>>>     * Add an op_java_workload_table containing the new test.
>>>
>>>     testsuite/lib/operf_util.exp:
>>>     * Add procedure (check_java_samples_exist) to see that samples can be
>>>       found that are associated with the generated .jo object.
>>>     * Add procedure (check_java_object_file_exists) to ensure that at
>>>       least one "*.jo" file was created during the run.
>>>     * Add procedure (do_java_test) to do the actual test.
>>>
>>>     testsuite/workloads/java/Fibonacci.java:
>>>     * Add the java test itself.
>>>
>>> -- 
>>>
>>> Thanks,
>>> -Will (Schmidt)
>>>
>>>
>>> diff --git a/testsuite/lib/op_util.exp b/testsuite/lib/op_util.exp
>>> index 7f0473d..863d46f 100644
>>> --- a/testsuite/lib/op_util.exp
>>> +++ b/testsuite/lib/op_util.exp
>>> @@ -179,15 +179,15 @@ proc check_user {} {
>>>  proc compile_workload {workload_src compile_options } {
>>>
>>>      # Ideally the TCL command target_compile should be used.  However,
>>>      # target_compile is ignoring the compiler options argument.
>>>
>>> -    set compiler "cc"
>>>      set extension [lindex [split $workload_src "."] 1]
>>> -    set workload_exc [ lindex [split $workload_src "."] 0]_bin
>>>
>>>      if { [string compare $extension "c"] == 0 } {
>>> +    set workload_exc [ lindex [split $workload_src "."] 0]_bin
>>> +    set compiler "cc"
>>>      # workload is a C program, see if it needs to be compiled.
>>>      set test [local_exec "ls $workload_exc" "" "" 10]
>>>
>>>      if { [lindex $test 0] == 1 } {
>>>          # workload has not been compiled
>>> @@ -198,10 +198,28 @@ proc compile_workload {workload_src compile_options } {
>>>          }
>>>      }
>>>      return [ lindex [split $workload_src "."] 0]_bin
>>>      }
>>>
>>> +    if { [string compare $extension "java"] == 0 } {
>>> +    set compiler "javac"
>>> +    set workload_exc [ lindex [split $workload_src "."] 0].class
>>> +    # workload is a java program, see if it needs to be compiled.
>>> +    set test [local_exec "ls $workload_exc" "" "" 10]
>>> +    if { [lindex $test 0] == 1 } {
>>> +        # workload has not been compiled
>>> +        set result [local_exec "$compiler $workload_src $compile_options" "" "" 10 ]
>>> +        if { [lindex $result 0] == 1 } {
>>> +        print "\nERROR compiling workload: $workload_src"
>>> +        print "Compiler error message: $result\n"
>>> +        }
>>> +    }
>>> +    set path_and_basename [lindex [split $workload_src "."] 0]
>>> +    set classonly [ lindex [ split $path_and_basename "/"] 2]
>>> +    return $classonly
>>> +    }
>>> +
>>>      # Assume the workload is a script, set the executable
>>>      # name to the same as the source name.
>>>      return $workload_src
>>>  }
>>>
>>> @@ -243,5 +261,67 @@ proc op_check_dependencies {} {
>>>          set op_deps_ok 0
>>>      } else {
>>>          set op_deps_ok 1
>>>      }
>>>  }
>>> +
>>> +proc op_resolve_java_dependencies {} {
>>> +    global java_deps_ok
>>> +    global path_to_libjvmti
>>> +    set libjvmti_oprofile_present 0
>>> +    set java_present 0
>>> +    set javac_present 0
>>> +    set operf_present 0
>>> +
>>> +    set path_to_operf [ local_exec "which operf" "" "" 100 ]
>>> +    if {[regexp "operf" $path_to_operf operf_present] == 1} {
>>> +    verbose "Found operf ($operf_present) at $path_to_operf ."
>>> +    } else {
>>> +    send "Didn't find operf.\n"
>>> +    }
>>> +
>>> +    set path_to_javac [ local_exec "which javac" "" "" 100 ]
>>> +    if {[regexp "javac" $path_to_javac javac_present] == 1} {
>>> +    verbose "Found javac ($javac_present) at $path_to_javac ."
>>> +    } else {
>>> +    send "javac is require to build the java testcase.  I didn't find javac via 'which'.\n"
>>> +    }
>>> +
>>> +    set path_to_java [ local_exec "which java" "" "" 100 ]
>>> +    if {[regexp "java" $path_to_java java_present] == 1} {
>>> +    verbose "Found java ($java_present) at $path_to_java ."
>>> +    } else {
>>> +    send "java is require to run the java testcase.  I didn't find java via 'which'.\n"
>>> +    }
>>> +
>>> +    # Finding libjvmti_oprofile.so.
>>> +    # In the case of a userspace build, the oprofile install location has
>>> +    # sibling /bin/ and /lib/ directories, so as long as we have found the
>>> +    # operf binary, we should be able to infer the location of libjvmti_oprofile.so.
>>> +    set path_to_libjvmti [string map {bin/operf lib/oprofile/libjvmti_oprofile.so} $path_to_operf ]
>>> +    set path_to_libjvmti [string trimleft $path_to_libjvmti "0\ \{"]
>>> +    set path_to_libjvmti [string trim $path_to_libjvmti "\ \n\r\}"]
>>> +    set libjvmti_oprofile_present [file exists $path_to_libjvmti ]
>>> +    if {$libjvmti_oprofile_present == 1 } {
>>> +    send "found libjvmti_oprofile ($libjvmti_oprofile_present) at $path_to_libjvmti . \n"
>>> +    } else {
>>> +    send "did not find libjvmti_oprofile in $path_to_libjvmti ) .\n"
>>> +    # search a few other common spots for the library.
>>> +    foreach path_to_libjvmti  { /usr/lib64/libjvmti_oprofile.so /usr/lib/libjvmti_oprofile.so } {
>>
>> Hi,
>>
>> There are some other places that libjvmti_oprofile.so might end up.  For rhel7:
>>
>> /usr/lib64/oprofile/libjvmti_oprofile.so
>>
>> For Red Hat developer tool 9 and 8:
>>
>> /opt/rh/devtoolset-9/root/usr/lib64/libjvmti_oprofile.so
>> /opt/rh/devtoolset-8/root/usr/lib64/libjvmti_oprofile.so
>>
>> For locally built oprofile default installs ended up with:
>>
>> /usr/local/lib/oprofile/lib/libjvmti_oprofile.so
>>
>> It might be better to determine which operf is being used and use the
>> beginning of its path to find the associated jvmti.so
> 
> Right.. earlier versions of this found some false positives in the environments I have, which is why the first spot I check was/is relative to wherever i found 'operf'.    Looks like I only look for a 'lib' sibling, so adding a lib64 sibling will probably resolve the others you have listed. .. as long as the operf binary is in a relative path to the libs.

It looks like the relative path to operf with check in lib64 would improve the situation.

> 
>> /usr/lib64/oprofile/libjvmti_oprofile.so
> 
> So, operf for this one is at .. /usr/bin/operf ?
> 
>> /opt/rh/devtoolset-9/root/usr/lib64/libjvmti_oprofile.so
>> /opt/rh/devtoolset-8/root/usr/lib64/libjvmti_oprofile.so
> 
> operf for these in /opt/rh/devtoolset-{7,8}/root/usr/bin/operf ?
> 
>> /usr/local/lib/oprofile/lib/libjvmti_oprofile.so
> 
> with operf at /usr/local/lib/oprofile/bin/operf  ?

Here is there is for the matching operf executable and libjvmit_oprofile.so:

For x86_64 rhel7:

/usr/bin/operf
/usr/lib64/oprofile/libjvmti_oprofile.so

devtoolset-8

/opt/rh/devtoolset-8/root/usr/bin/operf
/opt/rh/devtoolset-8/root/usr/lib64/libjvmti_oprofile.so

For the local install have

/usr/local/bin/operf
/usr/local/lib/oprofile/libjvmti_oprofile.so

-Will

> 
> 
> Thanks
> -Will (Schmidt)
> 
>>
>> -Will Cohen
> 



_______________________________________________
oprofile-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/oprofile-list