जावा प्रोग्राम कैसे ट्रेस करें?


25

एक sysadmin के रूप में मुझे कभी-कभी स्थितियों का सामना करना पड़ता है, जहां एक कार्यक्रम असामान्य रूप से व्यवहार करता है, जबकि बिल्कुल भी त्रुटियां पैदा नहीं करता है या बकवास त्रुटि-संदेश बनाता है।

अतीत में - जावा आने से पहले - दो प्रति-उपाय थे:

  1. अगर और कुछ नहीं मदद करता है - RTFM ;;;
  2. अगर 1. भी मदद नहीं करता है - सिस्टम-कॉल को ट्रेस करें और देखें कि क्या हो रहा है

मैं आमतौर पर strace -fलिनक्स के साथ इस कार्य के लिए उपयोग करता हूं (अन्य ओएस में समान ट्रेस-टूल हैं)। अब जबकि यह आम तौर पर किसी भी पुराने जमाने के कार्यक्रम के लिए अच्छा काम करता है, एक जावा -प्रोसेस पर ऐसा करने पर ट्रेस बहुत फजी हो जाता है । किसी भी वास्तविक कार्रवाई के लिए अविश्वसनीय रूप से असंबंधित इतने सारे सिस्टम-कॉल हैं, कि इस तरह के डंप के माध्यम से खोज करना भयानक है।

क्या ऐसा करने के बेहतर तरीके हैं (यदि स्रोत-कोड उपलब्ध नहीं है)?

जवाबों:


16

जैसा कि ckhan का उल्लेख है, jstackमहान है क्योंकि यह JVM में सभी सक्रिय थ्रेड्स का पूर्ण स्टैक ट्रेस देता है। वही SIGQUIT का उपयोग करके JVM के स्टेडर पर प्राप्त किया जा सकता है।

एक अन्य उपयोगी उपकरण है jmapजो प्रक्रिया के पीआईडी ​​का उपयोग करके जेवीएम प्रक्रिया से एक ढेर डंप ले सकता है:

jmap -dump:file=/tmp/heap.hprof $PID

इस ढेर डंप को उपकरण में लोड किया जा सकता है जैसे visualvm(जो अब मानक ओरेकल जावा एसडीके इंस्टॉल का हिस्सा है, जिसका नाम jvisualmm है)। इसके अलावा, VisualVM चल रहे JVM से कनेक्ट हो सकता है और JVM के बारे में जानकारी प्रदर्शित कर सकता है, जिसमें आंतरिक सीपीयू उपयोग के ग्राफ, थ्रेड काउंट्स, और हीप के उपयोग को प्रदर्शित करना शामिल है - लीक को ट्रैक करने के लिए बढ़िया।

एक अन्य उपकरण, jstatजेवीएम के लिए कचरा संग्रह के आंकड़ों को समय की अवधि में vmstat की तरह बहुत अधिक कर सकता है जब एक संख्यात्मक तर्क (जैसे vmstat 3) के साथ चलाया जाता है ।

अंत में, लोड-टाइम पर सभी ऑब्जेक्ट्स के सभी तरीकों पर इंस्ट्रूमेंटेशन को पुश करने के लिए जावा एजेंट का उपयोग करना संभव है। पुस्तकालय javassistइसे करने में बहुत आसान बनाने में मदद कर सकता है। तो, अपने स्वयं के अनुरेखण को जोड़ना संभव है। इसके साथ कठिन हिस्सा ट्रेस आउटपुट प्राप्त करने का एक तरीका होगा जब आप इसे चाहते थे और हर समय नहीं, जो संभवतः जेवीएम को क्रॉल करने के लिए धीमा कर देगा। एक कार्यक्रम है जिसे dtraceइस तरह से काम करता है। मैंने इसे आज़माया है, लेकिन बहुत सफल नहीं था। ध्यान दें कि एजेंट सभी वर्गों को लिख नहीं सकते हैं क्योंकि जेवीएम को बूटस्ट्रैप करने के लिए जरूरी हैं कि एजेंट को उपकरण से पहले लोड किया जाए, और फिर उन कक्षाओं में इंस्ट्रूमेंटेशन जोड़ने के लिए बहुत देर हो चुकी है।

मेरा सुझाव - VisualVM से शुरू करें और देखें कि क्या यह बताता है कि आपको क्या जानने की जरूरत है क्योंकि यह वर्तमान धागे और JVM के लिए महत्वपूर्ण आँकड़े दिखा सकता है।


वैसे, यह एक भयानक सवाल है; मुझे उम्मीद है कि अधिक लोग अन्य विचारों के साथ उत्तर जोड़ेंगे। जब मैंने लोगों से जावा के साथ काम करने के लिए कई सालों तक ट्रेसिंग के बारे में पूछा, तो उन्होंने मुझे ब्लैंक स्टार्स दिए। शायद वे सिर्फ स्ट्रेस की अजीबता को नहीं जानते हैं।
राख

10

उसी व्यर्थ में जब लिनक्स सिस्टम पर डिबगिंग प्रोग्राम चले गए हैं, तो आप अपने सिस्टम पर जेवीएम चलाने वाले डिबग के समान टूल का उपयोग कर सकते हैं।

उपकरण # 1 - jvmtop

इसी तरह top, आप jvmtop का उपयोग करके यह देख सकते हैं कि आपके सिस्टम पर चल रहे JVM के भीतर कौन सी कक्षाएं हैं। एक बार स्थापित होने के बाद आप इसे इस तरह से लागू करते हैं:

$ jvmtop.sh

इसका आउटपुट उपकरण की तरह दिखने के लिए समान है top:

 JvmTop 0.8.0 alpha   amd64  8 cpus, Linux 2.6.32-27, load avg 0.12
 http://code.google.com/p/jvmtop

  PID MAIN-CLASS      HPCUR HPMAX NHCUR NHMAX    CPU     GC    VM USERNAME   #T DL
 3370 rapperSimpleApp  165m  455m  109m  176m  0.12%  0.00% S6U37 web        21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager   11m   28m   23m  130m  0.00%  0.00% S6U37 web        31
19187 m.jvmtop.JvmTop   20m 3544m   13m  130m  0.93%  0.47% S6U37 web        20
16733 artup.Bootstrap  159m  455m  166m  304m  0.12%  0.00% S6U37 web        46

उपकरण # 2 - jvmmonitor

एक अन्य विकल्प jvmmonitor का उपयोग करना है । जेवीएम मॉनिटर एक जावा प्रोफाइलर है जिसे ग्रहण के साथ सीपीयू, थ्रेड और जावा अनुप्रयोगों के मेमोरी उपयोग की निगरानी के लिए एकीकृत किया गया है। आप इसका उपयोग या तो स्वचालित रूप से JVM को लोकलहोस्ट पर चलाने के लिए कर सकते हैं या यह पोर्ट @ होस्ट का उपयोग करके दूरस्थ JVM से जुड़ सकता है।

jvmmonitor के ss

उपकरण # 3 - विज़ुअल्म

विजुवम संभवतः "टूल" है जो जेवीएम के साथ मुद्दों को डीबग करने के लिए पहुंचता है। इसका फीचर सेट काफी गहरा है और आप इनर लुक में बहुत गहराई से देख सकते हैं।

प्रोफ़ाइल अनुप्रयोग प्रदर्शन या मेमोरी आवंटन का विश्लेषण करें:

विजुअल्म # 2 के एस.एस.

धागा डंप लें और प्रदर्शित करें:

विजुअल्म # 3 के एस.एस.

संदर्भ


4

विचार करें jstack। के लिए काफी मेल नहीं है strace, एक pstack-नगल के अधिक , लेकिन कम से कम आपको समय में एक स्नैपशॉट की तस्वीर देगा। यदि आपके पास कोई क्रूड ट्रेस पाने के लिए एक साथ स्ट्रिंग कर सकता है।

इस SO लेख पर सुझाव भी देखें: /programming/1025681/call-trace-in-ava


2

यदि आप RHEL OpenJDK का उपयोग कर रहे हैं (या समान है, तो मुद्दा यह है कि यह Oracle का JDK नहीं है), आप इसके लिए SystemTap का उपयोग कर सकते हैं ।

कुछ जांच जावा कमांड लाइन विकल्पों का उपयोग कर से सक्षम होते हैं -XX:+DTraceMethodProbes, -XX:+DTraceAllocProbes, -XX:+DTraceMonitorProbes। ध्यान दें कि ये जांच सक्षम करने से कार्यक्रम के प्रदर्शन पर प्रभाव पड़ेगा।

यहाँ उदाहरण SystemTap स्क्रिप्ट है:

#!/usr/bin/stap

probe hotspot.class_loaded {
    printf("%12s [???] %s\n", name, class);
}

probe hotspot.method_entry, 
      hotspot.method_return {
    printf("%12s [%3d] %s.%s\n", name, thread_id, class, method);
}

probe hotspot.thread_start, 
      hotspot.thread_stop {
    printf("%12s [%3d] %s\n", name, id, thread_name);
}

probe hotspot.monitor_contended_enter, 
      hotspot.monitor_contended_exit {
    printf("%12s [%3d] %s\n", name, thread_id, class);
}

आप jstack()प्रक्रिया के जावा स्टैक प्राप्त करने के लिए भी उपयोग कर सकते हैं , लेकिन यह केवल तभी काम करेगा जब आप JVM से पहले SystemTap शुरू करेंगे ।


ध्यान दें कि SystemTap हर विधि का पता लगाएगा । यह विधि के तर्क प्राप्त करने में भी सक्षम नहीं है। एक अन्य विकल्प जेवीएम की अनुरेखण की अपनी क्षमताओं का उपयोग करना है जिसे जेवीएमटीआई कहा जाता है। सबसे प्रसिद्ध जेवीएमटीआई कार्यान्वयन में से एक बीट्रेस है


0

आपको सलाह दी जाती है कि जैकप्ले को आज़माएं , जो एक जेवीएम ट्रेसिंग टूल है जिससे आप मेथड एंट्री ट्रेस कर सकते हैं और बिना कोड चेंज या रीडेपॉजिशन के बाहर निकल सकते हैं।


आप इसे एक रनिंग जेवीएम से नहीं जोड़ सकते। इसके अलावा - दिलचस्प उपकरण
Nils 20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.