2008-09-10 4 views
10

पर एक स्टैकट्रैक कैसे जोड़ सकता हूं डीबगिंग प्रिंटआउट से स्टैकट्रैक प्रिंट करने का सबसे आसान तरीका क्या है? अक्सर परीक्षण के दौरान आप एक डीबग संदेश को उत्तेजित करने वाली स्थिति तक पहुंचने वाले कॉलस्टैक को जानना चाहते हैं।मैं जावा में अपने डिबगिंग प्रिंटआउट

उत्तर

8
+0

नकारात्मकता यह है कि डंपस्टैक() केवल stderr पर जाता है, और आप इसे कहीं और नहीं भेज सकते जैसे आप अपवाद या थ्रेड.getStackTrace() के साथ कर सकते हैं। –

+4

लॉगिंग का उपयोग करें। Stdout/stderr को प्रिंट करना केवल ओएस उपयोगिताओं और "हैलो वर्ल्ड" ऐप्स द्वारा किया जाना चाहिए। –

2

आपको कोशिश-पकड़ ब्लॉक में अपवाद को पकड़ना चाहिए।

e.getStackTrace(); 

जो स्टैकट्रेस एलिमेंट [] देता है जिसे आप समझ सकते हैं।

इसके अलावा

:

e.printStackTrace() 

होगा ... स्टैकट्रेस मुद्रित करें।

4

बस एक मनमाना अपवाद बनाने के लिए काम कर देता है मुझे:

System.out.println("Oops, the bad thing happened"); 
new IllegalStateException().printStackTrace(); 
+0

आपको जूस चाहिए Thread.getStackTrace() का उपयोग नहीं करते हैं। – jjnguy

+0

मेरा मानना ​​है कि इस विधि से कुछ आईडीई जैसे इंटेलिजे में चेतावनी होगी, क्योंकि आप अपवाद बना रहे हैं लेकिन इसे फेंक नहीं रहे हैं। मैं थ्रेड.getस्टैकट्रेस() विधि की अनुशंसा करता हूं जिसमें एक ही तर्क है लेकिन यह डेवलपर से छिपा हुआ है। –

+0

Thread.dumpStack() आसान है अगर आप इसे stderr पर भेजना चाहते हैं (स्टैक ट्रेस तत्वों पर स्वयं लूप को सहेजता है)। –

3

साथ ही @jjnguy क्या कहा के रूप में, यदि आप एक अपवाद नहीं है, आप भी Thread.getStackTrace() कॉल कर सकते हैं।

4

आप एक स्ट्रिंग आप यह कर सकते हैं में स्टैक ट्रेस सहेजना चाहते हैं;

String exception = ""; 
for (StackTraceElement element : e.getStackTrace()) 
    exception += element.toString() + "\n"; 

जहां ई जाहिर है, एक अपवाद है।

इसके अलावा, यह एक डीबग के लिए एक स्टैक ट्रेस पाने के लिए अपने स्वयं के अपवाद को स्वत: उत्पन्न करने के लिए बहुत अजीब लगता है। ग्रहण प्राप्त करें और इसका डीबग मोड का उपयोग करें, यह वास्तव में कमाल है।

+0

क्या कोई भी e.getCause() के माध्यम से कदम या पुनर्संरचना नहीं कर सकता है, और उन सभी के लिए स्टैक निशान भी प्राप्त करना चाहिए? – slim

+0

मुझे विश्वास नहीं है कि ऐसा कोई कारण है जब आप इसे ऐसा करते हैं। – Chris

+0

एकाधिक concatenations के लिए 'स्ट्रिंग' के बजाय' स्ट्रिंगबिल्डर 'का उपयोग करें। Stdout/stderr का उपयोग न करने के लिए – minipif

16

आप log4j

Exception e = new Exception(); 
log.error("error here", e); 

उपयोग कर रहे हैं अपने लॉग में स्टैकट्रेस प्रिंट होगा।

+0

+1 –

1

सिर्फ इसलिए कि मैं इसे अपने आप की जरूरत:।

के रूप में जवाब How do I find the caller of a method using stacktrace or reflection? से प्रेरित है, तो आप कॉल का उपयोग कर ढेर

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace() 

तो फिर तुम पर कार्रवाई और प्रिंट/log जो कुछ भी आप में रुचि रखते हैं प्राप्त कर सकते हैं और अधिक काम Thread.dumpStack() का उपयोग करने से, लेकिन अधिक लचीला।

1

बस stderr करने के लिए वर्तमान स्टैक ट्रेस मुद्रित करने के लिए, आप कॉल कर सकते हैं:

Thread.dumpStack(); 

जो अपने आप में सिर्फ कॉल:

new Exception("Stack trace").printStackTrace(); 

उत्पादन करने के लिए करने के लिए stdout बल्कि stderr से, के लिए System.out पारित printStackTrace():

new Exception("Stack trace").printStackTrace(System.out); 
संबंधित मुद्दे