Bir Java uygulamasında uzaktan hata ayıklama


254

Linux makinesinde çalışan bir java uygulamam var. Java uygulamasını aşağıdakileri kullanarak çalıştırın:

java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n

Bu Linux makinesinde TCP için 4000 numaralı bağlantı noktasını açtım. Windows XP makinesinden tutulma kullanıyorum ve bu uygulamaya bağlanmaya çalışıyorum. Limanı da pencerelerde açtım.

Her iki makine de LAN'da ancak hata ayıklayıcıyı Java uygulamasına bağlayamıyorum. Neyi yanlış yapıyorum?




Hiç kopya değil. İlk olarak, bu daha eski bir soru. İkinci olarak, bu sorunun cevabı hata ayıklama ortamından bağımsız olmalıdır.
Addison

Yanıtlar:


476

Düzenleme: Bazı insanların buradaki çağrıyı kesip yapıştırdığını fark ettim. Başlangıçta verdiğim cevap sadece OP için geçerliydi. İşte daha modern bir çağırma stili (8000'in daha geleneksel portunun kullanılması dahil):

java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>

Orijinal cevap aşağıdadır.


Bunu dene:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp

Burada iki nokta:

  1. Seçenekte boşluk yok runjdwp.
  2. Seçenekler sınıf adından önce gelir. Sınıf adından sonra sahip olduğunuz argümanlar programınızın argümanlarıdır!


2
@DJGummikuh Güzel! -agentlibKesme ve yapıştırma keyfiniz için yeni stil seçeneğini kullanmak üzere yayını güncelledim . :-)
Chris Jester-Young

Uzaktan hata ayıklama yaptığımız makinede uzak uygulamanın kaynak koduna her zaman ihtiyacımız var mı?
MasterJoe2

Kaynak kodunu bilmeniz gerekir . Ya .java dosyalarınız var ya da decompiler ile birleştirilmiş .jar / .class dosyalarınız var. .
Iwan Satria

1
Bu stackoverflow.com/a/138518/500902 adresinden bir yorum tekrarlamaya değer , "Java 9" adres = 1044 "her zaman tüm arabirimleri dinlemiyor." Address = *: 1044 ", Java 9+ 'nın Java 8 gibi davranmasını sağlar" farklı ana bilgisayardan hata ayıklamaya izin
Marvin

84

JDK 1.3 veya öncesi için:

-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

JDK 1.4 için

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

Daha yeni JDK için:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6006

Lütfen bağlantı noktası numarasını ihtiyaçlarınıza göre değiştirin.

Gönderen java teknik notları

5.0'dan itibaren JDWP aracısına seçenekleri yüklemek ve belirtmek için -agentlib: jdwp seçeneği kullanılır. 5.0'dan önceki sürümler için -Xdebug ve -Xrunjdwp seçenekleri kullanılır (5.0 uygulaması -Xdebug ve -Xrunjdwp seçeneklerini de destekler, ancak daha yeni -agentlib: jdwp seçeneği, 5.0'daki JDWP aracısı JVM TI arabirimini eski JVMDI arayüzü yerine VM)

Dikkat edilmesi gereken bir şey daha, JVM Aracı arayüzü belgelerinden :

JVM TI, JDK 5.0'da tanıtıldı. JVM TI, JDK 6'dan itibaren artık sağlanmayan Java Sanal Makine Profil Oluşturucu Arabirimi'nin (JVMPI) ve Java Sanal Makine Hata Ayıklama Arabirimi'nin (JVMDI) yerini almaktadır.


Eclipse'in varsayılan ayarlarıyla aşağıdakiler çalışır: -agentlib: jdwp = transport = dt_socket, sunucu = y, adres = 8000
Sundae

29

Adımlar:

  1. Yukarıdaki yazıda belirtildiği gibi hata ayıklama seçenekleriyle uzak java uygulamanızı başlatın.
  2. Ana bilgisayar ve bağlantı noktasını belirterek Eclipse'i uzaktan hata ayıklama için yapılandırın.
  3. Eclipse'de uzaktan hata ayıklamayı başlatın ve bağlantının başarılı olmasını bekleyin.
  4. Kesme noktası ve hata ayıklamayı ayarlayın.
  5. Uygulama başlangıcında hata ayıklamak istiyorsanız suspend = y kullanın, bu, eclipse'tan bağlanana kadar uzak uygulamayı askıya alır.

Tüm ayrıntılar için Java uzaktan hata ayıklama ile ilgili Adım Adım kılavuzuna bakın.



8

Tartışma sırasının önemli olduğunu vurgulamak istiyorum .

Benim için java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jarkomut hata ayıklayıcı bağlantı noktasını açar ,

ama java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000komut vermez .


3
Sanırım ikinci örneğinizde, "app.jar" dan sonraki her şey ana yönteminize argümanlar olarak aktarılıyor
xoX Zeus Xox

@xoXZeusXox ha ha. Evet, argüman olarak geçti. Bahsettiğiniz için teşekkürler.
MrBlack

1

Eclipse Debugger'ı uzaktan hata ayıklama için şu şekilde ayarlamanız gerekir:

Eclipse Ayarları:

1. Çalıştır Düğmesine tıklayın
2. Hata Ayıklama Yapılandırmalarını seçin 3.
“Uzak Java Uygulaması”
nı seçin 4. Yeni Yapılandırma

  • İsim: GatewayPortalProject
  • Proje: GatewayPortal-portlet
  • Bağlantı Türü: Soket Takın
  • Bağlantı Özellikleri: i) localhost ii) 8787

JBoss için:

1. vm'nizi /path/toJboss/jboss-eap-6.1/bin/standalone.confaşağıdaki gibi değiştirin: # işaretini kaldırarak aşağıdaki satırı açın:

JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"

Tomcat için:

In catalina.bat dosyası:

Aşama 1:

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

Adım 2:

JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"

Adım 3: Tomcat'i aşağıdaki gibi komut isteminden çalıştırın:

catalina.sh jpda start

Sonra hata ayıklamak istediğiniz Java sınıflarında kesme noktaları ayarlamanız gerekir .


Java 8'de JDK, bir JAVA_TOOL_OPTIONS ortam değişkenini destekler, böylece herhangi bir Java uygulaması için hata ayıklayıcıyı etkinleştirmeniz gerekir: JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n ps düzenlemeler için üzgünüm, biçimlendirici ile mücadele.
Nathan Niesen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.