- PR -

JVMPIについて

投稿者投稿内容
がっさん
常連さん
会議室デビュー日: 2003/10/03
投稿数: 24
投稿日時: 2003-10-21 16:10
今、JVMPIについて学習している者です。

Javaプログラムによってロードされるすべてのクラスをトレースする
myprofiler.cpp(java.sun.comのサンプルコード)を Makefileを用いて
コンパイルするのがうまくいきません。
myprofiler.cpp、Makefileのコードとエラーの内容は以下です。

[環境]
JDK:j2sdk1.4
コンパイラ:MinGW(eclipseプラグインを利用してeclipse上でコンパイル)


---------------------myprofiler.cc--------------------------
#include <jvmpi.h>

// global jvmpi interface pointer
static JVMPI_Interface *jvmpi_interface;

// function for handling event notification
void notifyEvent(JVMPI_Event *event) {
switch(event->event_type) {
case JVMPI_EVENT_CLASS_LOAD:
fprintf(stderr, "myprofiler> Class Load : %s\\\\n", event->u.class_load.class_name);
break;
}
}

// profiler agent entry point
extern "C" {
JNIEXPORT jint JNICALL JVM_OnLoad(JavaVM *jvm, char *options, void *reserved) {
fprintf(stderr, "myprofiler> initializing ..... \\\\n");

// get jvmpi interface pointer
if ((jvm->GetEnv((void **)&jvmpi_interface, JVMPI_VERSION_1)) < 0) {
fprintf(stderr, "myprofiler> error in obtaining jvmpi interface pointer\\\\n");
return JNI_ERR;
}

// initialize jvmpi interface
jvmpi_interface->NotifyEvent = notifyEvent;

// enabling class load event notification
jvmpi_interface->EnableEvent(JVMPI_EVENT_CLASS_LOAD, NULL);

fprintf(stderr, "myprofiler> .... ok \\\\n\\\\n");
return JNI_OK;
}
}

-----------------------Makefile(最初の数字は行番号)-------------------------
1:JDK_HOME = C:\\\\j2sdk1.4
2:
3:INCLUDES = -I. -I$(JDK_HOME)\\\\include -I$(JDK_HOME)\\\\include\\\\win32
4:
5:SRC_DIR = .
6:
7:all: myprofiler.dll
8:
9:myprofiler.dll: $(SRC_DIR)\\\\myprofiler.cpp
10: cl -LDd -Zi -Zp1 $(INCLUDES) -Tp$(SRC_DIR)\\\\myprofiler.cpp -o $@ /link /libpath:"C:\\\\j2sdk1.4\\\\lib" jvm.lib
11:
12:
13:clean:
14: del *.lib
15: del *.dll
16: del *.ilk
17: del *.pdb
18: del *.obj
19: del *.exp

----------------エラー------------------
*** multiple target pattern. Stop


10行目でエラーが出ているみたいです。
よろしくお願いします。

_________________
学生
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-10-21 16:53
こんにちは、さくらばです。

引用:

がっさんさんの書き込み (2003-10-21 16:10) より:
Javaプログラムによってロードされるすべてのクラスをトレースする
myprofiler.cpp(java.sun.comのサンプルコード)を Makefileを用いて
コンパイルするのがうまくいきません。

10: cl -LDd -Zi -Zp1 $(INCLUDES) -Tp$(SRC_DIR)\\myprofiler.cpp -o $@ /link /libpath:"C:\\j2sdk1.4\\lib" jvm.lib




Visual C++ もしくは VisualStdio を持っていますか?
cl というのはコマンドラインの VC++ のコンパイラなのです。

もし、持っていなかったら GCC かなにかをインストールして、
Makefile をそれにあわせて書き換える必要があります。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2003-10-21 17:39
引用:

----------------エラー------------------
*** multiple target pattern. Stop


これ、10行目の先頭がTAB以外になっているのが原因でしょう。
ここはTABでなくてはなりません。

あと、MinGWならC++コンパイラはclではなく、g++になると思います。
コマンドラインオプションも変更する必要があります。
(今回はDLLを作るので-sharedが必要)
がっさん
常連さん
会議室デビュー日: 2003/10/03
投稿数: 24
投稿日時: 2003-10-21 18:06
引用:

さくらばさんの書き込み (2003-10-21 16:53) より:
Visual C++ もしくは VisualStdio を持っていますか?
cl というのはコマンドラインの VC++ のコンパイラなのです。



Visual C++も使ってみようと考えていますが、できれば
MinGWコンパイラを使いたいです。

引用:

もし、持っていなかったら GCC かなにかをインストールして、
Makefile をそれにあわせて書き換える必要があります。



以下のようなページがありました。
http://www.gnu.org/manual/make/html_chapter/make_toc.html

Makefileについてほとんど知識がないため、勉強する必要がありますね。
何かアドバイスがありましたら、よろしくお願いします。


_________________
学生
がっさん
常連さん
会議室デビュー日: 2003/10/03
投稿数: 24
投稿日時: 2003-10-21 19:45
ちいにぃさんの書き込み (2003-10-21 17:39) より:

引用:

あと、MinGWならC++コンパイラはclではなく、g++になると思います。
コマンドラインオプションも変更する必要があります。
(今回はDLLを作るので-sharedが必要)



以下のようなMakefileにしてみたら、myprofiler.dllを作ることができました。

--------------------------Makefile------------------------------

JDK_HOME = C:\j2sdk1.4

INCLUDES = -I. -I$(JDK_HOME)\include -I$(JDK_HOME)\include\win32

SRC_DIR = .

all : myprofiler.dll

myprofiler.dll: myprofiler.cpp
gcc -shared $(INCLUDES) myprofiler.cpp -o $@

.PHONY: clean
clean:
del *.dll
----------------------------------------------------------------

しかし実際に、C:\j2sdk1.4\jre\bin\client にmyprofiler.dllファイルをおき







_________________
学生
がっさん
常連さん
会議室デビュー日: 2003/10/03
投稿数: 24
投稿日時: 2003-10-21 19:46
失礼いたしました。

ちいにぃさんの書き込み (2003-10-21 17:39) より:

引用:

あと、MinGWならC++コンパイラはclではなく、g++になると思います。
コマンドラインオプションも変更する必要があります。
(今回はDLLを作るので-sharedが必要)



以下のようなMakefileにしてみたら、myprofiler.dllを作ることができました。

--------------------------Makefile------------------------------

JDK_HOME = C:\j2sdk1.4

INCLUDES = -I. -I$(JDK_HOME)\include -I$(JDK_HOME)\include\win32

SRC_DIR = .

all : myprofiler.dll

myprofiler.dll: myprofiler.cpp
gcc -shared $(INCLUDES) myprofiler.cpp -o $@

.PHONY: clean
clean:
del *.dll
----------------------------------------------------------------

しかし実際に、C:\j2sdk1.4\jre\bin\client にmyprofiler.dllファイルをおき

% java -Xrunmyprofiler クラス名

としても
Error occurred during initialization of VM
Could not find JVM_OnLoad function in -Xrun library: myprofiler
とエラーメッセージが返ってきます。

何か設定がおかしいのでしょうか。
よろしくお願いします。



_________________
学生

[ メッセージ編集済み 編集者: がっさん 編集日時 2003-10-21 19:47 ]
raccoon
ベテラン
会議室デビュー日: 2002/12/18
投稿数: 58
投稿日時: 2003-10-21 20:49
C:\j2sdk1.4\jre\bin\client
にちゃんと%PATH%環境変数通していますよね?
(もしくはカレントにしているか)

であれば,
dumpbin /exports myprofiler.dll
で,JVM_OnLoad関数がちゃんとEXPORTされているか
確認してみるといいかも。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-10-21 22:00
こんにちは、さくらばです。

引用:

がっさんさんの書き込み (2003-10-21 19:46) より:

しかし実際に、C:j2sdk1.4jrebinclient にmyprofiler.dllファイルをおき

% java -Xrunmyprofiler クラス名

としても
Error occurred during initialization of VM
Could not find JVM_OnLoad function in -Xrun library: myprofiler
とエラーメッセージが返ってきます。



C:\j2sdk1.4\jre\bin\client におかないで、PATH の通っているところに
おけば大丈夫だと思います。

# C:\j2sdk1.4\jre\bin\client におく理由はあまりないと思うんですが...
# jvm.dll と一緒にしておく必要はないです

ところで、JVMPI って使いたい人多いのでしょうか。Web で解説を書こうか
どうしようか迷っているのです。

参考 (Flash が必要です)
http://www5.airnet.ne.jp/sakuraba/java/publication/20030414-JIAE-Seminar/20030414JIAE-profiler.html

スキルアップ/キャリアアップ(JOB@IT)