JVM'yi hata ayıklama bağımsız değişkenleriyle başlatmadan bir Java uygulamasında hata ayıklayın


98

Normalde, çalışan bir jvm'ye bir hata ayıklayıcı eklemek için, jvm'yi aşağıdaki gibi bağımsız değişkenlerle başlatmanız gerekir:

> java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n

Şimdi, hata ayıklama modunda başlatılmamış bir işlemde hata ayıklamak istersem, ne yapabilirim?

Bu durum, bir üretim sistemi (yani hata ayıklama argümanları olmadan başlatılan) bir 'rastgele' (terimi gevşekçe kullanıyorum) bir hata gösterdiğinde ortaya çıkar. Bu yüzden jvm'yi uygun argümanlarla yeniden başlatamıyorum çünkü kimse hatayı nasıl yeniden üreteceğini bilmiyor. Bu durumda JVM'ye bağlanmak imkansız mı?

Hata ayıklama modunda başlatılmadıkları sürece zaten çalışan JVM'lere eklemek için jdb gibi araçları kullanmanın mümkün olmadığını açıklığa kavuşturmak için

JVM man sayfasından

Jdb'yi kullanmanın başka bir yolu, onu zaten çalışan bir Java sanal makinesine eklemektir. Jdb ile hata ayıklanacak bir sanal makine aşağıdaki seçeneklerle başlatılmalıdır:


Ayrıca bkz. Çalışan bir
JVM'de

Yanıtlar:


48

İşleme bir hata ayıklama sunucusu eklemek için jsadebugd ( JDK ) kullanabilirsiniz (Windows'ta Windows için Hata Ayıklama Araçları ile birlikte mevcuttur ). Deneysel olarak işaretlenmiştir, bu nedenle önce bir test makinesinde denemek isteyebilirsiniz.

Kullanım:

jsadebugd <pid>
jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost

Arg ile bağlayıcı adı kullanılarak bulunabilir jdb -listconnectors.


1
Linux kullanıyorum, bu yüzden bu en umut verici çözüm gibi görünüyor
hhafez

Bununla paylaşacak deneyimleriniz var mı?
Thorbjørn Ravn Andersen

1
Benim deneyimim, ihtiyacım olan zamanlarda iyi çalıştı, bu arada yazılımın tüm fabrika örnekleri varsayılan olarak jvm hata ayıklama seçenekleriyle başlatılacak şekilde yapılandırılmadı, böylece desteklenen yöntemi kullanabiliriz.
hhafez

Java 11'de jsadebugdyerini jhsdb debugd. Böylece bu olur jhsdb debugd --pid <pid>. Bkz konuşma başvuru jhsdb slaytları ve jhsdb için dokümanlar
Delthas

Görünüşe göre SADebugServerAttachingConnectorde kaldırıldı jdbve sanırım değiştirmenin jhsdb hsdb/ olması gerekiyor jhsdb clhsdb. Hangi argümanlara verileceğine dair herhangi bir belge bulamıyorum jhsdb clhsdb.
Delthas

32

Hata ayıklama modunda başlatılmadıkları sürece jdb gibi araçları zaten çalışan JVM'lere eklemek için>> kullanmanın mümkün olmadığını açıklığa kavuşturmak

sovyet rusya'daki kaynak seni okuyor

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426

1
Pekala, bu "desteklenen" cevap ama deneysel cevap kabul ettiğim cevap, yani desteklenmeyen bir ortamda yapılabilir
hhafez

7

VisualVM bir hata ayıklayıcı değildir, ancak ondan bazı sorunları tanılamada yararlı olabilecek iş parçacığı dökümleri ve yığın dökümleri alabilirsiniz. En kullanışlı özellikler JVM 5 veya 6 gerektirir.


bağlantı çalışmıyor .... belki http: // 'yi https: //' den önce kaldırırsınız ... Ben olurdum ama henüz yeterince itibara sahip
değilim

+1 VisualVM gerçekten ilginç görünüyor. BTW: Bağlantı şimdi düzeltildi.
sleske

5

jstack (kilitlenme durumunda faydalıdır) veya btrace VisualVM eklentisini kullanmak da hile yapabilir


-5

Her zaman jdb kullanabilir ve elle hata ayıklayabilirsiniz: P


2
Hata ayıklama bağlantılarına izin vermek için jvm ile başlatılmadıkça, jvm'ye jdb ile bağlanamayacağınızı hep düşünmüşümdür. Yanlış mıyım?
hhafez

Anladığım kadarıyla, bahsettiğiniz seçenek "java" komutunuzun (VM) uzaktan hata ayıklamasını "etkinleştirmektir" Ancak bunun yerine jdb komutunu da kullanabilirsiniz. Yani java MyApp yerine jdb MyApp gibi gideceksiniz (ve etkileşimli olarak hata ayıklama, kesme noktaları ayarlama, çalıştırma, durdurma, izleme vb.)
OscarRyz

1
Bunun jdb man sayfasına göre doğru olduğunu sanmıyorum - alıntıyı başlat jdb'yi kullanmanın başka bir yolu, onu zaten çalışan bir Java sanal makinesine eklemektir. Jdb ile hata ayıklanacak bir sanal makine aşağıdaki seçeneklerle başlatılmalıdır: - end quote
hhafez

Doğru bağlayıcıyla (şimdilik desteklenmemektedir) jdb çalışan bir işleme bağlanabilir.
Thorbjørn Ravn Andersen
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.