Question

Depuis une semaine, j'essaie de compiler une version de démonstration de l'ensemble de démonstration JVMTI. Dans ce cas, j'ai essayé de compiler le code source de HeapViewer (je viens de renommer le fichier HeapViewer.c à HeapViewerBymg). J'ai essayé différents compilateurs et utilisé principalement le code suivant que j'ai trouvé sur stackOverflow aussi:

// compile with Microsoft Windows C++ compiler
set JAVA_HOME="C:\Program Files\Java\jdk1.6.0_26"
set JVMTI_DEMO=%JAVA_HOME%\demo\jvmti
set AGENT_SRC=%JVMTI_DEMO%\agent_util\src
set CRW_SRC=%JVMTI_DEMO%\java_crw_demo\src
set CFLAGS=/MD /Zi /Ox /Os /Gy /c
cl %CFLAGS% /I%AGENT_SRC% %AGENT_SRC%\agent_util.c /I%CRW_SRC% /I%JAVA_HOME%\include /I%JAVA_HOME%\include\win32
cl %CFLAGS% /I%CRW_SRC% /I%JAVA_HOME%\include /I%JAVA_HOME%\include\win32 %CRW_SRC%\java_crw_demo.c
cl %CFLAGS% /I%AGENT_UTIL% /I%CRW_SRC% /I%JAVA_HOME%\include /I%AGENT_SRC% /I%JAVA_HOME%\include\win32 heapViewerByMG.c
link -dll -out:heapViewerByMG.dll heapViewerByMG.obj java_crw_demo.obj agent_util.obj

// compile with g++ compiler von MINGW
set JAVA_HOME="C:\Program Files\Java\jdk1.6.0_26"
set JVMTI_DEMO=%JAVA_HOME%\demo\jvmti
set AGENT_SRC=%JVMTI_DEMO%\agent_util\src
set CRW_SRC=%JVMTI_DEMO%\java_crw_demo\src
gcc -c -I%AGENT_SRC% %AGENT_SRC%\agent_util.c -I%CRW_SRC% -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32
gcc -c -I%CRW_SRC% -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 %CRW_SRC%\java_crw_demo.c
gcc -c -o heapViewerByMG.dll -I%AGENT_UTIL% -I%AGENT_SRC% -I%CRW_SRC% -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 heapViewerByMG.c

Mon code compile le succès dans les deux cas, mais lorsque j'essaie d'utiliser les fichiers DLL, j'obtiendrai l'erreur suivante:

"L'application ou DLL (...) HeapViewerBymg.dll n'est pas une image Windows valide. Veuillez vérifier cela par rapport à votre disquette d'installation."

J'ai également recherché ce que ce message signifie. La recherche m'a dit qu'il s'agit alors d'un fichier corrompu, mais je peux exclure ceci car j'ai compilé un code source donné par le JVM. Quoi qu'il en soit, je crois que c'est juste une autre commande d'option que j'ai besoin de laisser exécuter le fichier réussi. Est-ce que quelqu'un d'entre vous a une idée?

Voici quelques détails de mon système:

C:\>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)

C:\>gcc --version gcc (GCC) 4.5.2 Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


C:\>cl -version
Microsoft (R) C/C++ Optimizing Compiler Version 14.00.50727.762 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

Ou après avoir changé le compilateur Microsoft de 64 bits à 32 bits (car c'était l'un des anciens messages d'erreur, lorsque j'ai commencé l'agent)

C:\>VCVARS32

C:\>"C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat"
Setting environment for using Microsoft Visual Studio 2005 x86 tools.

C:\>cl -version
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86

Copyright (C) Microsoft Corporation.  All rights reserved.

Et j'exécute un pack de services Microsoft Windows XP Professional version 2002 sur un Intel (R) 4 CPU 2,80 GHz avec 2,00 Go de RAM

Désolé pour ce système. Habituellement, j'utilise un MacBook Pro 2010 (2,8 GHz Intel Core i7), mais j'ai compris que MacOS n'a pas inclus le support de la démo-version JVMTI :(

J'espère que quelqu'un peut m'aider.

Salutations Markus G.

Était-ce utile?

La solution

Je ne sais pas où se trouve la différence dans la version supérieure, mais ces lignes de commande crée un agent qui s'exécute bien (sur le système supérieur mentionné), si vous copiez le fichier DLL dans la bibliothèque (..java_home jre bin) :

VCVARS32
cd C:\Program Files\Java\jdk1.6.0_26\demo\jvmti\heapViewerByMG\src
set JAVA_HOME="C:\Program Files\Java\jdk1.6.0_26"
set JVMTI_DEMO=%JAVA_HOME%\demo\jvmti
set AGENT_SRC=%JVMTI_DEMO%\agent_util\src
set CRW_SRC=%JVMTI_DEMO%\java_crw_demo\src
set CFLAGS= /Op /Ox /Zi /Gy -DWIN32 /WX
cl %CFLAGS% /I%AGENT_SRC% %AGENT_SRC%\agent_util.c /I%CRW_SRC% /I%JAVA_HOME%\include /I%JAVA_HOME%\include\win32
cl %CFLAGS% /I%CRW_SRC% /I%JAVA_HOME%\include /I%JAVA_HOME%\include\win32 %CRW_SRC%\java_crw_demo.c
cl %CFLAGS% /I%AGENT_UTIL% /I%CRW_SRC% /I%JAVA_HOME%\include /I%AGENT_SRC% /I%JAVA_HOME%\include\win32 heapViewerByMG.c
link -dll -out:heapViewerByMG.dll heapViewerByMG.obj java_crw_demo.obj agent_util.obj

Maintenant, copiez le fichier DLL dans le répertoire supérieur mentionné et utilisez la ligne de commande suivante pour exécuter le test:

C:\Program Files\Java\jdk1.6.0_26\demo\jvmti\heapViewerByMG\src>java -agentlib:h
eapViewerByMG -version
Compile Time JVMTI Version: 1.1.102 (0x30010166)
Run Time JVMTI Version: 1.2.1 (0x30010201)
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)

Quoi qu'il en soit, je ne sais toujours pas, pourquoi cela n'a pas fonctionné plus tôt ... Markus G.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top