2015-02-15 6 views
5

तो, मैंन आया हुआ अपवाद पर jdb संलग्न

java -agentlib:jdwp=transport=dt_socket,address=8000, server=y,suspend=n MyClass 

नीचे के रूप में एक जावा प्रोग्राम शुरू करने कर रहा हूँ मैं तो मैन्युअल रूप से नीचे के रूप में

jdb -attach 8000 

मैं अगर वहाँ के लिए वैसे भी है जानना चाहूंगा एक डिबगर देते हैं मुझे जेडीबी स्थापित करने के लिए ताकि यह स्वचालित रूप से बिना किसी अपवाद के मामले में चल रही प्रक्रिया (केवल) से जुड़ा हो?

कारण यह है कि मैं एक अपरिचित अपवाद उत्पन्न होने तक डीबगर के ऊपरी हिस्से से बचना चाहता हूं। लेकिन अब जिस समस्या का सामना करना पड़ता है वह यह है कि अगर डीबगर संलग्न नहीं होता है, तो एक बार अपरिपक्व अपवाद उत्पन्न होने पर JVM aborts।

संपादित करें:

ओरेकल docs से, यह नीचे आदेश मैं क्या जरूरत है, लेकिन खिड़कियां मशीनों के लिए लगता है।

java -agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe MyClass 

कोई भी लिनक्स समकक्ष जानता है? मैंने नीचे दिए गए आदेश की कोशिश की है।

java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,onuncaught=y,suspend=n,launch=jdb MyClass 

डीबगर ऐसा लगता है जैसे यह कनेक्ट होता है लेकिन यह तुरंत आईओईआरर फेंकता है।

Initializing jdb ... 

java.io.IOException: Input/output error 
at java.io.FileInputStream.readBytes(Native Method) 
at java.io.FileInputStream.read(FileInputStream.java:272) 
at java.io.BufferedInputStream.read1(BufferedInputStream.java:273) 
at java.io.BufferedInputStream.read(BufferedInputStream.java:334) 
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) 
at java.io.InputStreamReader.read(InputStreamReader.java:184) 
at java.io.BufferedReader.fill(BufferedReader.java:154) 
at java.io.BufferedReader.readLine(BufferedReader.java:317) 
at java.io.BufferedReader.readLine(BufferedReader.java:382) 
at com.sun.tools.example.debug.tty.TTY.<init>(TTY.java:751) 
at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1067) 

उत्तर

0

इसके बजाय एक डिबगर का उपयोग कर और दूर से एक संलग्न की, क्यों आप एक uncaught exception handler पैदा नहीं Thread.UncaughtExceptionHandler का उपयोग कर सकता हूँ?

public class ThreadCatch 
{ 
    public static void main(String... args) 
    { 
     new ThreadCatch().go(); 
    } 

    public void go() 
    { 
     try { 
      Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
       @Override 
       public void uncaughtException(Thread t, Throwable e) { 
        System.out.println("Uncaught exception"); 
        e.printStackTrace(); 
       } 
      }); 

      final Thread thread = new Thread(new A()); 
      thread.start(); 
      thread.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    class A implements Runnable 
    { 
     int x = 10; 

     @Override 
     public void run() 
     { 
      x++; 
      ObjectTrackingException obj = new ObjectTrackingException(); 
      obj.setThrownFrom(this); 
      throw obj; 
     } 
    } 
} 


class ObjectTrackingException extends RuntimeException 
{ 
    private Object thrownFrom; 

    public Object getThrownFrom() { 
     return thrownFrom; 
    } 

    public void setThrownFrom(Object thrownFrom) { 
     this.thrownFrom = thrownFrom; 
    } 
} 

enter image description here

+0

ठीक है, मैं प्रोग्राम क्रैश के बिंदु पर स्टैक पर चर के मानों का विश्लेषण करना चाहता हूं। मुझे नहीं लगता कि मैं इसे बिना किसी अपवाद के साथ कर सकता हूं, क्योंकि स्टैक विलुप्त हो जाएगा क्योंकि अपवाद ऊपर से गुजरता है? – nave

+0

अपवाद हैंडलर पर सशर्त ब्रेकपॉइंट क्यों सेट नहीं करें? इस तरह आप अपवाद को पकड़ने के लिए मिलता है और ब्रेकपॉइंट आपको कॉल स्टैक पर स्किम करने की अनुमति देता है। –

+0

तो, जैसा कि मैं इसे समझता हूं, जब एक अपवाद फेंक दिया जाता है तो एक विधि बी कहता है, विधि के लिए कॉल स्टैक नष्ट हो जाता है और अपवाद ऊपर की ओर फेंक दिया जाता है। यह आय, आखिरकार अपवाद अनकॉचएक्सप्शन हैंडलर तक पहुंच जाएगा। लेकिन इस समय तक, विधि का कॉल स्टैक जहां अपवाद शुरू में हुआ (और जिनके स्थानीय चर मैं देखना चाहता हूं) अब वहां नहीं है। तो एक सशर्त ब्रेकपॉइंट मदद नहीं करेगा? अगर मेरी समझ में कुछ गड़बड़ है तो कृपया मुझे बताएं ... – nave

3

ठीक समय पर एक डिबगर अनुलग्न करने के लिए वास्तव में विकल्प आप सुझाव है (launch और onuncaught) का उपयोग करता है। लेकिन launch विकल्प को लिनक्स पर अधिक की आवश्यकता है:

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

आपके मामले में, jdb टर्मिनल TTY यह संदर्भ यह। वातावरण जहां यह चल रहा है पर निर्भर करता है में शुरू की जा रही है की वजह से जरूरत को खोलने के लिए विफल हो रहा है, आप एक स्क्रिप्ट है कि में jdb की शुरूआत का निर्माण करने की आवश्यकता होगी एक नई खिड़की या इसे एक pseduo-tty से जोड़ती है ताकि वह ठीक से चल सके।

मैं एक स्क्रिप्ट screen का उपयोग करता है बनाने टर्मिनल

#!/bin/bash 
# according to launch option doc, the first argument is the transport and 
# the second argument will be the address 
# 
screen -dm -L -S autojdb jdb -attach $2 

यह स्क्रिप्ट एक अलग स्क्रीन में jdb शुरू करने और स्क्रीन autojdb के लिए सत्र का नाम होगा शुरू करने के लिए द्वारा इस परीक्षण किया गया। आप screen -ls का उपयोग कर अपनी स्क्रीन की सूची देख सकते हैं। जब आप डीबगर का उपयोग करना चाहते हैं जिसे screen -r autojdb का उपयोग शुरू किया गया है।अपने लांच विकल्प के अंतर्गत आपकी राह में स्क्रिप्ट डाल करने के लिए या पूर्ण पथ (नीचे /home/me/screenjdb) देना सुनिश्चित करें:

java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,onuncaught=y,suspend=n,launch=/home/me/screenjdb MyClass 

मेरी स्क्रिप्ट में मैं भी -L पारित कर दिया स्क्रीन करने के लिए जो सत्र लॉग करता है। यह सत्र रिकॉर्ड करेगा लेकिन अगर आपको कुछ कारणों से अनुलग्नक विफल रहता है तो आपको कोई भी त्रुटि दिखाई देगी।

संबंधित मुद्दे

 संबंधित मुद्दे