混合モードでjstackを使用してネイティブの呼び出しスタックを調べようとしましたが、jstackが常にこのエラーメッセージを表示することがわかりました。
sili@linux32:~$ jps
2834 Jps
2825 Server
sili@linux32:~$ jstack -m 2825
Attaching to process ID 2825, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
-mパラメーターがなくても、すべて問題ありません。そして私のOSはubuntu11.04で、java-versionの出力は
sili@linux32:~$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode, sharing)
また、私のテストプログラムは以下のように非常に単純です。OracleがリリースしたJava、または自分がソースから構築したガンマをlanuch Serverに使用しようとしていますが、どちらもjstack混合モードでは動作しません。
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
class Server {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(10000);
Socket accept = server.accept();
InputStream in = accept.getInputStream();
byte[] buf = new byte[1024];
int num = in.read(buf);
String str = new String(buf,0,num);
System.out.println(str);
accept.close();
server.close();
}
}
Oracleのjstackページによると、混合モードはremoveデバッガーでのみ機能します。