2009-03-26 7 views
44

Wiem, jak mogę debugować zdalną maszynę wirtualną Java za pomocą Eclipse, ale jak mogę to zrobić z programem Java Web Start. Mam problem, który występuje tylko w Java Web Start. Musi być związany z bezpieczeństwem.Jak mogę debugować aplikacje w Java Web Start (JNLP)?

Potrzebuję rozwiązania, które będzie działać z obecną maszyną wirtualną Java, taką jak 1.6.0_12.

Odpowiedz

22

To tak samo, jak w przypadku każdego innego procesu Java, który chcesz zdalnie debugować: Musisz ustawić kilka argumentów dla VM (-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=12345 ), a następnie połączyć się z danym portem. W webstarcie Java 6.0 można to zrobić za pomocą opcji -J, we wcześniejszej wersji za pomocą zmiennej środowiskowej JAVAWS_VM_ARGS. Zobacz szczegóły here.

+0

Uwaga: używanie Ubuntu 10.04 i 12.04 oraz Webstart 6.0 działało tylko po ustawieniu parametru ** server = y **. W przeciwnym razie wystąpił błąd 'ERROR: JDWP Transport dt_socket nie mógł się zainicjować, TRANSPORT_INIT (510)', nawet jeśli port nie był w użyciu. –

1

Czy próbowałeś wydrukować dziennik debugowania? W każdym razie jest to przydatne i może pomóc w tym przypadku.

Jeśli chcesz prawdziwego debugowania, zobacz np. tutaj: How can I debug under WebStart?

+0

To naprawdę fajne mieć bezpośrednią kontrolę nad wszystkimi aspektami uruchamiania JVM ... A także możesz sprawdzić wszystkie rzeczy, które program uruchamiający WS dodaje z ekranu początkowego po uruchomieniu ... –

21

Uruchom maszynę wirtualną JWS ręcznie. W ten sposób można podać parametry uruchamiania, aby otworzyć port debugowania. Oto description, to idzie tak:

set JAVAWS_TRACE_NATIVE=1 
set JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=n" 
javaws http://server:port/descriptor.jnlp 
+1

+1 za wspaniałą odpowiedź. Jednak to nie pozwoli mi go edytować, aby naprawić literówkę w odpowiedzi. Nie powinno być miejsca przed "address = 8989". – fool4jesus

+0

@mkoeller w javaws http: // serwer: port/descriptor.jnlp który numer portu powinienem podać – Rekha

+5

Tylko uwaga, w Windows (Testowany na XP), gdy ustawisz 'JAVAWS_VM_ARGS' musisz OMIT PODWÓJNE ZGODY' ustawić JAVAWS_VM_ARGS = -Xdebug -Xnoagent -Djava.compiler = BRAK -Xrunjdwp: transport = dt_socket, adres = 8989, serwer = y, zawieś = n' –

9

Można również podać parametr debug do pliku wykonywalnego javaws używając opcji -J

Przykład:

javaws.exe -J-Xdebug -J-Xnoagent -J-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 http://server:port/descriptor.jnlp 
1

debugować Web Uruchom aplikację w systemie Linux, utwórz skrypt powłoki ~/bin/javaws-debug.sh z wywołaniem javaws w trybie debugowania, jak opisano powyżej:

~/bin/javaws-debug.sh:

#!/bin/sh 
export JAVAWS_TRACE_NATIVE=1 
export JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Djava.compiler=NONE 
    -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=n" 
javaws "[email protected]" 

Następnie w przeglądarce wybierz ten skrypt jako aplikację do wywoływania w plikach jnlp.

Na przykład w przeglądarce Firefox przejdź do Edycja → Preferencje → Aplikacje, Typ zawartości: Java Web Start i wybierz "Użyj innych" w Akcji i wybierz skrypt z okna "Wybierz aplikację pomocniczą". W przeglądarce Chrome musisz zmienić ustawienia systemu Linux. W KDE przejdź do Ustawienia systemowe → Powiązania plików, Znane typy: aplikacja: plik x-java-jnlp, dodaj nową aplikację, wybierz ~/bin/javaws-debug.sh z "Wybierz aplikację dla aplikacji/x-java "-jnlp-file" dialog.

Gdy przeglądarka jest skonfigurowana aplikacja Java Web Start rozpocznie korzystanie z opakowania, co pozwoli debuggera do połączenia na porcie 8989.

12

Co do nowszych wersji Java (Java 8u20 + i Java 7u70 +) i doświadczył, że parametry takie jak -Xrunjdwp nie mogą być przekazywane bezpośrednio ani za pomocą JAVAWS_VM_ARGS. Wiadomość Rejecting attempt to specify insecure property: -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 zaczęła pojawiać się na konsoli.

Jedynym rozwiązaniem, które zadziałało, było przekazanie tych argumentów do zmiennej systemowej JAVA_TOOL_OPTIONS.

+1

Dzięki za napisanie tego, rozwiązałeś go dla mnie. Potrzebne do usunięcia opcji debugowania z JAVAWS_VM_ARGS i przeniesienia ich do JAVA_TOOL_OPTIONS podczas przenoszenia z wersji 1.7.0_10 do 1.7.0_75 –

+0

To działało również dla mnie, mam kilka jdków na mojej maszynie, więc nigdy nie wiem, który z nich zostanie uruchomiony: - | – bakoyaro

+2

Próbowałem tego, ale pewnego rodzaju kontrola bezpieczeństwa musiała zapobiec uruchomieniu javaws (z JAVA_TOOL_OPTIONS nie by się zaczęło, bez tego by się zaczęło). –

1

W języku Java 8 i Windows 10 otwórz wiersz polecenia (cmd.exe) i wpisz:

set JAVAWS_TRACE_NATIVE=1 
set JAVA_TOOL_OPTIONS=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 
javaws java-app.jnlp 
2

Trzeba będzie wykonać następujące czynności:

  1. Włącz dzienniki Java i śledzenie w Panelu sterowania Java> Zaawansowane. Java Control Panel: logs and tracing

  2. Włącz parametry do debugowania Java (opcjonalne, ale użyteczny czyli problemy z TLS/SSL handshake jako close_notify lub handshake_failure) & uruchomienie JNLP, istnieją dwa sposoby, można to zrobić:

    2.a. Pobierz plik JNLP i uruchom go z wiersza poleceń (polecenie SET nie jest wymagane w tym konkretnym przypadku).

    set JAVA_TOOL_OPTIONS=-Djavax.net.debug=all 
    javaws -wait jnlp.jnlp 
    

    2.b. Dodaj argumenty (tj -Djavax.net.debug=all) dla JVM w Java Panel sterowania> Java> View (nie jest to wymagane w tym zwłaszcza) i uruchom plik JNLP z przeglądarki:

    Java Control Panel: jvm arguments

  3. kłody i ślady znajdują się w katalogu log od Java Deployment Home, skąd wklejam te lokalizacje:

    a. Windows XP: %HOME%\Application Data\Sun\Java\Deployment

    b. Windows 7/Vista: %APPDATA%\..\LocalLow\Sun\Java\Deployment

    c. Linux/Solaris: %HOME%/.java/deployment

Z javax.net.debug = wszystko widać handshake jeśli słoik wewnątrz JNLP jest ładowany z połączenia HTTPS. Tego rodzaju problemy są trudne do debugowania.

... 
%% No cached client session 
*** ClientHello, TLSv1.2 
... 
*** 
... 
Java Web Start Main Thread, received EOFException: error 
Java Web Start Main Thread, handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 
Java Web Start Main Thread, SEND TLSv1.2 ALERT: fatal, description = handshake_failure 
Java Web Start Main Thread, WRITE: TLSv1.2 Alert, length = 2 
Java Web Start Main Thread, called closeSocket() 
#### Java Web Start Error: 
+1

Miksujesz debugowanie z logowaniem/śledzeniem. – Horcrux7

+0

@ Horcrux7 rację. Myślę, że logowanie może być postrzegane jako sposób debugowania :) – lmiguelmh

Powiązane problemy