PING: RFR(S): 8240360: NativeLibraryEvent has wrong library name on Linux

Denghui Dong denghui.ddh at alibaba-inc.com
Fri Mar 20 02:12:48 UTC 2020


PING: Could you review it?

Webrev: http://cr.openjdk.java.net/~ddong/8240360/webrev.01/
JBS: https://bugs.openjdk.java.net/browse/JDK-8240360

In Linux, EventNativeLibrary has a wrong name if the target library is located in a device whose device number (major or minor) exceeds the range of two digits.

My fix is small, use "%*s" to ignore perms, offset and device.

--- old/src/hotspot/os/linux/os_linux.cpp 2020-03-10 14:35:41.224134041 +0800
+++ new/src/hotspot/os/linux/os_linux.cpp 2020-03-10 14:35:41.090129104 +0800
@@ -2078,20 +2078,18 @@

     // Read line by line from 'file'
     while (fgets(line, sizeof(line), procmapsFile) != NULL) {
-      u8 base, top, offset, inode;
-      char permissions[5];
-      char device[6];
+      u8 base, top, inode;
       char name[sizeof(line)];

-      // Parse fields from line
-      int matches = sscanf(line, UINT64_FORMAT_X "-" UINT64_FORMAT_X " %4s " UINT64_FORMAT_X " %5s " INT64_FORMAT " %s",
-             &base, &top, permissions, &offset, device, &inode, name);
-      // the last entry 'name' is empty for some entries, so we might have 6 matches instead of 7 for some lines
-      if (matches < 6) continue;
-      if (matches == 6) name[0] = '\0';
+      // Parse fields from line, discard perms, offset and device
+      int matches = sscanf(line, UINT64_FORMAT_X "-" UINT64_FORMAT_X " %*s %*s %*s " INT64_FORMAT " %s",
+             &base, &top, &inode, name);
+      // the last entry 'name' is empty for some entries, so we might have 3 matches instead of 4 for some lines
+      if (matches < 3) continue;
+      if (matches == 3) name[0] = '\0';

-      // Filter by device id '00:00' so that we only get file system mapped files.
-      if (strcmp(device, "00:00") != 0) {
+      // Filter by inode 0 so that we only get file system mapped files.
+      if (inode != 0) {

         // Call callback with the fields of interest
         if(callback(name, (address)base, (address)top, param)) {


Thanks,
Denghui Dong



------------------------------------------------------------------
From:董登辉(卓昂) <denghui.ddh at alibaba-inc.com>
Send Time:2020年3月10日(星期二) 14:16
To:hotspot-jfr-dev <hotspot-jfr-dev at openjdk.java.net>
Subject:Re: RFR(S): 8240360: NativeLibraryEvent has wrong library name on Linux

Hi,
I used a new way to fix this problem.
Ignore "perms", "offset" and "device" fields by "%*s" so that we don't need to be concerned about the length of the device,
and use "inode" instead of "device" for filtering.

Webrev: http://cr.openjdk.java.net/~ddong/8240360/webrev.01/

Could you review it?

Thanks,
Denghui Dong
------------------------------------------------------------------
From:董登辉(卓昂) <denghui.ddh at alibaba-inc.com>
Send Time:2020年3月4日(星期三) 12:05
To:hotspot-jfr-dev <hotspot-jfr-dev at openjdk.java.net>
Subject:Re: RFR(S): 8240360: NativeLibraryEvent has wrong library name on Linux

Testing: jdk/jfr all passed.
------------------------------------------------------------------
From:董登辉(卓昂) <denghui.ddh at alibaba-inc.com>
Send Time:2020年3月3日(星期二) 22:25
To:hotspot-jfr-dev <hotspot-jfr-dev at openjdk.java.net>
Subject:RFR(S): 8240360: NativeLibraryEvent has wrong library name on Linux

Hi team,

I found TestNativeLibrariesEvent is always failed in my Linux environment.

The root cause is that os::get_loaded_modules_info in os_linux.cpp can not read library name correctly,
because the device number in my Linux environment is 103:01, the format passed to sscanf can't identify
it.

I found the limit of major and minor device number in Linux from 
https://github.com/torvalds/linux/blob/master/include/linux/kdev_t.h, and made this patch.

Please review this small change that fixes this problem.

Bug: https://bugs.openjdk.java.net/browse/JDK-8240360
Webrev: http://cr.openjdk.java.net/~ddong/8240360/webrev.00/


Thanks
Denghui Dong



More information about the hotspot-jfr-dev mailing list