I don't understand why this format is totally different from the normal stack 
traces? At least the header with the stack names could be similar?

Gruss
Bernd
--
http://bernd.eckenfels.net
________________________________
From: serviceability-dev <serviceability-dev-boun...@openjdk.java.net> on 
behalf of chihiro ito <chihiro....@oracle.com>
Sent: Wednesday, June 14, 2017 9:17:42 AM
To: Jini George; serviceability-dev@openjdk.java.net
Subject: Re: [10] RFR 8181647: jhsdb jstack could not output thread name

Hi all,

I added a test case and modified previous patch including fix the
copyright year to 2017.
I changed to output Java thread name next the separator lines in "jhsdb
jstack --mixed" case as following.

----------------- 32117 -----------------
"main"
0x00007f6c8feafa82    __pthread_cond_timedwait + 0x132

Could you possibly review for this following small change? If review is
ok, please commit this as cito.


Source:
diff --git
a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/PStack.java
b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/PStack.java
--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/PStack.java
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/PStack.java
@@ -1,5 +1,5 @@
  /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights
reserved.
+ * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights
reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
@@ -88,6 +88,12 @@
                 out.print("----------------- ");
                 out.print(th);
                 out.println(" -----------------");
+               JavaThread jthread = (JavaThread) proxyToThread.get(th);
+               if (jthread != null) {
+                   out.print("\"");
+                   out.print(jthread.getThreadName());
+                   out.println("\"");
+               }
                 while (f != null) {
                    ClosestSymbol sym = f.closestSymbolToPC();
                    Address pc = f.pc();
diff --git
a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/StackTrace.java
b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/StackTrace.java
---
a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/StackTrace.java
+++
b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/StackTrace.java
@@ -1,5 +1,5 @@
  /*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights
reserved.
+ * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights
reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
@@ -75,7 +75,9 @@
              for (JavaThread cur = threads.first(); cur != null; cur =
cur.next(), i++) {
                  if (cur.isJavaThread()) {
                      Address sp = cur.getLastJavaSP();
-                    tty.print("Thread ");
+                    tty.print("\"");
+                    tty.print(cur.getThreadName());
+                    tty.print("\" nid=");
                      cur.printThreadIDOn(tty);
                      tty.print(": (state = " + cur.getThreadState());
                      if (verbose) {
diff --git a/test/serviceability/sa/JhsdbThreadNameTest.java
b/test/serviceability/sa/JhsdbThreadNameTest.java
new file mode 100644
--- /dev/null
+++ b/test/serviceability/sa/JhsdbThreadNameTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License
version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com<http://www.oracle.com> if you need additional 
information or have any
+ * questions.
+ */
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Consumer;
+
+import jdk.test.lib.apps.LingeredApp;
+import jdk.test.lib.JDKToolLauncher;
+import jdk.test.lib.Platform;
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.Utils;
+
+/*
+ * @test
+ * @library /test/lib
+ * @run main/othervm JhsdbThreadNameTest
+ */
+public class JhsdbThreadNameTest {
+
+    private static String notMixedModeThreadNames[] =
{"Common-Cleaner", "Signal Dispatcher", "Finalizer", "Reference
Handler", "main"};
+    private static String mixedModeThreadNames[] = {"C2
CompilerThread0", "C1 CompilerThread1", "Sweeper thread", "Service Thread"};
+
+    private static void startHsdbJstack(boolean mixed) throws Exception {
+
+        LingeredApp app = null;
+
+        try {
+            List<String> vmArgs = new ArrayList<String>();
+            vmArgs.add("-Xmx10m");
+            vmArgs.addAll(Utils.getVmOptions());
+
+            app = LingeredApp.startApp(vmArgs);
+            System.out.println("Started LingeredApp with pid " +
app.getPid());
+
+            JDKToolLauncher jhsdbLauncher =
JDKToolLauncher.createUsingTestJDK("jhsdb");
+
+            jhsdbLauncher.addToolArg("jstack");
+            jhsdbLauncher.addToolArg("--pid");
+            jhsdbLauncher.addToolArg(Long.toString(app.getPid()));
+
+            if (mixed) {
+                jhsdbLauncher.addToolArg("--mixed");
+            }
+            ProcessBuilder pb = new ProcessBuilder();
+            pb.command(jhsdbLauncher.getCommand());
+            Process jhsdb = pb.start();
+
+            jhsdb.waitFor();
+
+            OutputAnalyzer out = new OutputAnalyzer(jhsdb);
+
+
Arrays.stream(notMixedModeThreadNames).map(JhsdbThreadNameTest::addQuotationMarks).forEach(out::shouldContain);
+            Consumer<String> testMethod = null;
+            if (mixed) {
+                testMethod = out::shouldContain;
+            } else {
+                testMethod = out::shouldNotContain;
+            }
+
Arrays.stream(mixedModeThreadNames).map(JhsdbThreadNameTest::addQuotationMarks).forEach(testMethod);
+
+        } catch (InterruptedException ie) {
+            throw new Error("Problem awaiting the child process: " +
ie, ie);
+        } catch (Exception attachE) {
+            throw new Error("Couldn't start jhsdb, attach to
LingeredApp or match ThreadName: " + attachE);
+
+        } finally {
+            LingeredApp.stopApp(app);
+        }
+    }
+
+    private static String addQuotationMarks(String str) {
+        return "\"" + str + "\"";
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        if (!Platform.shouldSAAttach()) {
+            System.out.println("SA attach not expected to work - test
skipped.");
+            return;
+        }
+
+        startHsdbJstack(true);
+        startHsdbJstack(false);
+    }
+}


Regards,
Chihiro


On 2017/06/08 18:04, chihiro ito wrote:
> Hi Jini,
>
> Thank you for your advices. I try to add the test case and modify the
> copyright year to 2017.
> Basically, I agree with your idea, but I think that the separator line
> should finally be the same as the output of the jstack command. I
> worry which is better way.
>
> Thanks,
> Chihiro
>
> On 2017/06/08 16:42, Jini George wrote:
>> Hi Chihiro,
>>
>> Thank you for making this useful change. Your changes look good.
>>
>> It would be great though if you could add a test case for this. Could
>> you also modify the copyright year to 2017 ? One additional
>> suggestion: The addition of the thread name makes the separator lines
>> unaligned in the pstack/jstack --mixed cases. Like:
>>
>> ----------------- "Service Thread" nid=16051 -----------------
>> and
>> ----------------- nid=16052 -----------------
>>
>> So I am wondering if it would make sense to have the name printed out
>> on a separate line to keep the separator lines aligned. But this is a
>> nit, and I would leave it to you to decide on this.
>>
>> Thanks,
>> Jini (Not a (R)eviewer)
>>
>> On 6/7/2017 3:16 PM, chihiro ito wrote:
>>> Hi all,
>>>
>>> I changed to output Java thread name in jhsdb jstack as following.
>>>
>>> jhsdb jstack --pid 25879
>>> "main" nid=25884: (state = BLOCKED)
>>>
>>> jhsdb jstack --mixed --pid 25879
>>> ----------------- "main" nid=25884 -----------------
>>>
>>> Could you possibly review for this following small change? If review
>>> is ok, please commit this as cito.
>>>
>>> Source:
>>> diff --git
>>> a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/PStack.java
>>> b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/PStack.java
>>> ---
>>> a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/PStack.java
>>> +++
>>> b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/PStack.java
>>> @@ -86,6 +86,13 @@
>>>              try {
>>>                 CFrame f = cdbg.topFrameForThread(th);
>>>                 out.print("----------------- ");
>>> +               JavaThread jthread = (JavaThread)
>>> proxyToThread.get(th);
>>> +               if (jthread != null) {
>>> +                   out.print("\"");
>>> +                   out.print(jthread.getThreadName());
>>> +                   out.print("\" ");
>>> +               }
>>> +               out.print("nid=");
>>>                 out.print(th);
>>>                 out.println(" -----------------");
>>>                 while (f != null) {
>>> diff --git
>>> a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/StackTrace.java
>>> b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/StackTrace.java
>>>
>>> ---
>>> a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/StackTrace.java
>>> +++
>>> b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/StackTrace.java
>>> @@ -75,7 +75,9 @@
>>>              for (JavaThread cur = threads.first(); cur != null; cur
>>> = cur.next(), i++) {
>>>                  if (cur.isJavaThread()) {
>>>                      Address sp = cur.getLastJavaSP();
>>> -                    tty.print("Thread ");
>>> +                    tty.print("\"");
>>> +                    tty.print(cur.getThreadName());
>>> +                    tty.print("\" nid=");
>>>                      cur.printThreadIDOn(tty);
>>>                      tty.print(": (state = " + cur.getThreadState());
>>>                      if (verbose) {
>>>
>>> Regards,
>>> Chihiro
>>>
>>
>

--

Chihiro Ito | Principal Consultant | +81.90.6148.8815
Oracle <http://www.oracle.com> Consultant
ORACLE Japan | Akasaka Center Bldg. | Motoakasaka 1-3-13 | 1070051
Minato-ku, Tokyo, JAPAN

Oracle is committed to developing practices and products that help
protect the environment <http://www.oracle.com/commitment>

Reply via email to