[10] RFR 8181647: jhsdb jstack could not output thread name
Bernd Eckenfels
ecki at zusammenkunft.net
Wed Jun 14 07:51:10 UTC 2017
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-bounces at openjdk.java.net> on behalf of chihiro ito <chihiro.ito at oracle.com>
Sent: Wednesday, June 14, 2017 9:17:42 AM
To: Jini George; serviceability-dev at 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>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20170614/92db301a/attachment-0001.html>
More information about the serviceability-dev
mailing list