When Hotspot SA tools jmap, jstack, and jsadebugd are run against a core file,
they fail with the following runtime exception:
OS/CPU combination linux/ppc64 not yet supported
I will post a patch set that adds this support. The patch set consists of the
following patches:
PATCH 1/2: Updates to non-Java files to support linux/ppc64 Hotspot SA with
core files
PATCH 2/2: New PPC64 class files (and updates to generic files) to support
linux/ppc64 Hotspot SA with core files
These two patches apply cleanly to a November 13 pull of the jdk9-dev upstream
sources.
------------
Open issues:
------------
1) The jstack tool does not print a stack entry for the 'main()' method of
the Java
workload (attached) under test. For example:
(Note: Addresses and method signatures elided for brevity.)
Thread 24358: (state = IN_JAVA, current Java SP = null
)
- java.lang.String.getChars(...) @bci=58, line=814, pc=..., Method*=...
(Compiled frame; ... imprecise)
- test.run_test() @bci=80, line=33, pc=..., Method*=... (Compiled frame)
==> (Expect an entry for test.main() here)
2) The jstack tool sometimes prints what appears to be two complete stacks
for the Java workload. For example:
Thread 24779: (state = IN_JAVA, current Java SP = null
)
- java.lang.String.getChars(...) @bci=58, line=814, pc=..., Method*=...
(Compiled frame; ... imprecise)
- test.run_test() @bci=80, line=33, pc=..., Method*=... (Compiled frame)
- test.get_my_chars(...) @bci=39, line=15, pc=..., Method*=...
(Compiled frame)
- test.run_test() @bci=92, line=34, pc=..., Method*=... (Compiled frame)
Again, the 'test.main' method is missing, but there's also the anomaly
of the
test.run_test' method showing up twice in the stack, implying that it is
called
by 'test.get_my_chars' at line 15. But that that is not accurate. In
fact, run_test
does call String.getChars at line 33 *and* it calls test.get_my_chars at
line 34 --
but these are totally distinct call graphs. Somehow, we are seeing
these two distinct
stacks in the core file, which seems impossible.
---------
Any help offered on these two open issues would be greatly appreciated.
-Maynard
import java.io.*;
public class test
{
java.io.FileWriter fs;
void get_my_chars(int k, int the_end, char[] the_dest, String seed,
int iter ) throws Exception
{
seed.getChars(k,the_end,the_dest,0);
if (iter >= 100000000 && iter % 500 == 0) {
String str = new String(the_dest,0,the_end-k);
String msg = "my interim string is " + str + "\n";
fs.write(msg, 0, msg.length());
}
}
String run_test() throws Exception
{
System.out.println("hi from run_test\n");
String seed = "For all good men";
java.io.File junk = new File("./junk.txt");
fs = new FileWriter(junk);
char dest[] = new char[20];
int j = 0;
int end = seed.length();
seed.getChars(0,end,dest, 0);
for (int i = 0; i < 200000000; i++) {
j = i % 10;
seed.getChars(j,end,dest, 0);
get_my_chars(j, end, dest, seed, i);
}
fs.flush();
fs.close();
return new String(dest,0,end-j);
}
public static void main(String argv[])
{
int pid = 0;
try {
pid = Integer.parseInt(new File("/proc/self").getCanonicalFile().getName());
} catch (Exception e) {
System.out.println("Caught exception getting PID: " + e);
}
System.err.println("My PID: " + pid + "\n");
System.out.println("Hello, world\n");
test tst = new test();
String res ="";
try {
res = tst.run_test();
} catch (Exception e) {
System.out.println("Caught exception " + e);
}
System.out.println("Ending string is " + res + "\n");
}
}