Скомпилируйте агент без ошибок и сообщение «Недопустимый образ Windows» - PullRequest
2 голосов
/ 15 июня 2011

с одной недели я пытаюсь скомпилировать демо-версию демонстрационного набора JVMTI. В этом случае я попытался скомпилировать исходный код HeapViewer (я просто переименовал файл HeapViewer.c в HeapViewerByMG). Я пробовал другой компилятор и использовал в основном следующий код, который я также нашел в stackOverflow:

// 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

Мой код успешно компилируется в обоих случаях, но когда я пытаюсь использовать DLL-файлы, я получаю следующую ошибку:

"Приложение или DLL (...) \ heapViewerByMG.dll не является допустимым Образ Windows. Пожалуйста, проверьте это напротив вашей установочной дискеты. "

Я также посмотрел, что означает это сообщение. Исследование показало мне, что это поврежденный файл, но я могу это исключить, так как JVM скомпилировал исходный код. Во всяком случае, я считаю, что это просто еще одна опция команды, которая мне нужна, чтобы запустить файл успешно. У кого-нибудь из вас есть идея?

Вот некоторые детали моей системы:

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.

Или после того, как я изменил компилятор Microsoft с 64-разрядного на 32-разрядный (потому что это было одно из старых сообщений об ошибках при запуске агента)

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.

И я использую Microsoft Windows XP Professional версии 2002 с пакетом обновления 3 (SP3) на процессоре Intel® R 2,80 ГГц с 2,00 ГБ ОЗУ

Извините за эту систему. Обычно я использую MacBook Pro 2010 (Intel Core i7 с частотой 2,8 ГГц), но я понял, что в MacOS не включена поддержка демоверсии JVMTI: (

Я надеюсь, что кто-нибудь сможет мне помочь.

Поздравления Маркус Г.

1 Ответ

1 голос
/ 16 июня 2011

Я не знаю, в чем разница с верхней версией, но эта командная строка создает агент, который хорошо работает (в упомянутой выше системе), если вы копируете dll-файл в библиотеку (..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

Теперь скопируйте файл DLL в верхний каталог и используйте следующую командную строку для запуска теста:

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)

Во всяком случае, я до сих пор не знаюпочему это не сработало раньше ... Маркус Г.

...