জাট-এ কীভাবে বর্তমান স্ট্যাকের ট্রেস পাব Environment.StackTrace
? নেট আপনি কীভাবে করতে পারেন তেমন ?
আমি খুঁজে পেয়েছি Thread.dumpStack()
তবে এটি আমি যা চাই তা নয় - আমি স্ট্যাকের ট্রেসটি ফিরে পেতে চাই, এটি প্রিন্ট করে না।
জাট-এ কীভাবে বর্তমান স্ট্যাকের ট্রেস পাব Environment.StackTrace
? নেট আপনি কীভাবে করতে পারেন তেমন ?
আমি খুঁজে পেয়েছি Thread.dumpStack()
তবে এটি আমি যা চাই তা নয় - আমি স্ট্যাকের ট্রেসটি ফিরে পেতে চাই, এটি প্রিন্ট করে না।
উত্তর:
আপনি ব্যবহার করতে পারেন Thread.currentThread().getStackTrace()
।
এটি একটি অ্যারের প্রদান করে StackTraceElement
যা কোনও প্রোগ্রামের বর্তমান স্ট্যাক ট্রেসকে উপস্থাপন করে।
String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e);
stackoverflow.com/a/10620951/11236
new Throwable().getStackTrace()
কারণ এটি পরীক্ষা করার দরকার নেই অনেক দ্রুত হয়, this != Thread.currentThread()
ও শিশু শ্রেণীর মাধ্যমে এটি কলিং (সম্ভাব্য জেভিএম overheads রোধ করা যাবে Exception extends Throwable
)
Thread.currentThread().getStackTrace();
আপনি যদি স্ট্যাকের প্রথম উপাদানটি কী তা যত্নশীল না করেন তবে ঠিক আছে।
new Throwable().getStackTrace();
যদি তা বিবেচনা করে তবে আপনার বর্তমান পদ্ধতির জন্য একটি সংজ্ঞায়িত অবস্থান থাকবে।
(new Throwable()).getStackTrace()
খুব দ্রুত কার্যকর হচ্ছে (দেখুন bugs.sun.com/bugdatedia/view_bug.do?bug_id=6375302 )
(new Exception()).getStackTrace()
অনুরোধ করা হলে স্ট্যাক ট্রেস বর্তমান থ্রেডে আছে (যা সবসময় কেনার ক্ষেত্রে দেখা হবেThread.currentThread().getStackTrace();
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
System.out.println(ste);
}
new Exception().printStackTrace(System.out)
যা আমি মনে রাখতে পারি, লুপটির জন্য সম্ভবত ওভারহেড কম রয়েছে, তবে আপনার কেবল এটি ডিবাগিং জিনিস হিসাবে ব্যবহার করা উচিত ...
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { if(ste.toString().contains("mypackages")){ System.out.println(ste); } }
Thread.currentThread().getStackTrace();
JDK1.5 থেকে পাওয়া যায়।
একটি পুরোনো সংস্করণ জন্য, আপনি পুনর্নির্দেশ করতে পারেন exception.printStackTrace()
একটি থেকে StringWriter()
:
StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();
new Throwable().getStackTrace()
জেডি কে 1.4-এর পরে পাওয়া যায় ...
আপনি এটির জন্য অ্যাপাচি কমন্স ব্যবহার করতে পারেন:
String fullStackTrace = org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
org.apache.commons.lang3
তার জন্য পুরো লাইনটি হ'ল:org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
org.apache.commons.lang3
, যা আমি প্রাথমিকভাবে উপেক্ষা করেছি - আমদানির lang3
পরিবর্তে আমদানি ব্যবহার করে lang
এবং এর সাথে প্রতিস্থাপন getFullStackTrace
করে getStackTrace
।
ExceptionUtils.getStackTrace(new Throwable())
স্ট্যাক ট্রেস পেতে এক্সপ্রেশনটি ব্যবহার করা দুর্দান্ত ।
অ্যান্ড্রয়েডে আরও সহজ উপায় হ'ল এটি ব্যবহার করা:
import android.util.Log;
String stackTrace = Log.getStackTraceString(exception);
সমস্ত থ্রেডের স্ট্যাক ট্রেস পেতে আপনি জেস্ট্যাক ইউটিলিটি, জে কনসোল ব্যবহার করতে পারেন বা একটি কিল-কোট সিগন্যাল (কোনও পোস্টিক্স অপারেটিং সিস্টেমে) প্রেরণ করতে পারেন।
তবে আপনি যদি এই প্রোগ্রামটিমেটিকভাবে করতে চান তবে আপনি থ্রেডএমএক্সবিয়ান ব্যবহার করে দেখতে পারেন:
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] infos = bean.dumpAllThreads(true, true);
for (ThreadInfo info : infos) {
StackTraceElement[] elems = info.getStackTrace();
// Print out elements, etc.
}
উল্লিখিত হিসাবে, আপনি যদি কেবল বর্তমান থ্রেডের স্ট্যাক ট্রেস চান তবে এটি অনেক সহজ - কেবল ব্যবহার করুন Thread.currentThread().getStackTrace()
;
System.err.println(elems[i])
প্রতিটি ব্যবহার করেন)। স্নিপেটের দ্বিতীয় লাইনটি এর bean.
আগে অনুপস্থিত dumpAllThreads
তবে আমার ধারণা বেশিরভাগ লোকেরা এটি কাজ করতে পারে।
অন্য একটি সমাধান (কেবলমাত্র 35 31 অক্ষর):
new Exception().printStackTrace();
new Error().printStackTrace();
টনি, গৃহীত উত্তরের মন্তব্য হিসাবে, সেরা উত্তর বলে মনে হচ্ছে যা আসলে ওপি-র প্রশ্নের উত্তর দেয় :
Arrays.toString(Thread.currentThread().getStackTrace()).replace( ',', '\n' );
... ওপি হয়নি না কিভাবে পেতে জিজ্ঞাসা String
একটি থেকে স্ট্যাক ট্রেস থেকে Exception
। এবং যদিও আমি অ্যাপাচি কমন্সের একটি বিশাল অনুরাগী, যখন উপরের মতো সাধারণ কিছু রয়েছে তখন বাইরের পাঠাগারটি ব্যবহার করার কোনও যৌক্তিক কারণ নেই।
Thread.getAllStackTraces()
যা আপনাকে এ Map<Thread, StackTraceElement[]>
। হটস্পট সমস্ত থ্রেডকে সাফল্যযুক্ত করবে যখনই এটির একটি সাফপয়েন্ট দরকার হয়। জিং অন্যকে বিরক্ত না করে স্বতন্ত্র থ্রেডগুলিকে সাফপয়েন্টে নিয়ে আসতে পারে। স্ট্যাকট্রেস পেতে একটি সাফপয়েন্ট requires Thread.getAllStackTraces()
সমস্ত স্ট্যাক ট্রেস পায় এবং সমস্ত থ্রেড কেবল একবার বন্ধ করে দেয়। অবশ্যই আপনাকে অবশ্যই কোন ম্যাপিংয়ের বিষয়ে আগ্রহী তা অবশ্যই খুঁজে বার করতে হবে
আমার পরামর্শ হচ্ছে
Thread.dumpStack()
একটি সহজ উপায় এবং আসলে কোনও সমস্যা নাও হতে পারে আসলে একটি ব্যতিক্রম বা থ্রোয়েবল না বানানোর সুবিধা রয়েছে এবং এটি আরও উল্লেখযোগ্য বিষয়।
new Exception("Stack trace").printStackTrace();
সুতরাং এটি আসলে একটি থ্রোয়েবল তৈরি করছে
স্ট্যাকট্রেস পাওয়া:
StackTraceElement[] ste = Thread.currentThread().getStackTrace();
মুদ্রণ স্ট্যাকট্রেস (জাভা 8+):
Arrays.asList(ste).forEach(System.out::println);
মুদ্রণ স্ট্যাকট্রেজ (জাভা 7):
StringBuilder sb = new StringBuilder();
for (StackTraceElement st : ste) {
sb.append(st.toString() + System.lineSeparator());
}
System.out.println(sb);
জাভা 9 এ একটি নতুন উপায় রয়েছে:
public static void showTrace() {
List<StackFrame> frames =
StackWalker.getInstance( Option.RETAIN_CLASS_REFERENCE )
.walk( stream -> stream.collect( Collectors.toList() ) );
for ( StackFrame stackFrame : frames )
System.out.println( stackFrame );
}
আমার কাছে একটি ইউটিলিটি পদ্ধতি রয়েছে যা স্ট্যাকট্রেসের সাহায্যে একটি স্ট্রিং প্রদান করে:
static String getStackTrace(Throwable t) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw, true);
t.printStackTrace(pw);
pw.flush();
sw.flush();
return sw.toString();
}
এবং ঠিক যেমন লগিট ...
...
catch (FileNotFoundException e) {
logger.config(getStackTrace(e));
}
java.util.logging.Logger#log(Level, String, Throwable)
ইতিমধ্যে এটি করে। এটি জাভা স্ট্যান্ডার্ড লাইব্রেরিতে অকারণে ইতিমধ্যে বিদ্যমান জিনিসগুলিকে আবার লিখন করছে এবং নতুন বিকাশকারীকে ভুল দিকে নির্দেশ করছে যা ডকুমেন্টেশন থেকে দূরে রয়েছে। এখন এটি করে আপনি স্ট্যাকট্রেসকে একটি নির্দিষ্ট উপায়ে ফর্ম্যাট করতে বাধ্য করেছেন, যেখানে logging
এপিআই আপনাকে লগ স্টেটমেন্টের বিন্যাসকে স্বনির্ধারণের সাথে পরিবর্তনশীলভাবে পরিবর্তন করতে দেয়। আমার জ্ঞানের সাথে, log4j
একইরকম আচরণও রয়েছে। চাকাটি পুনরায় উদ্ভাবন করবেন না কারণ আপনি যে জিনিসগুলি আমি ব্যাখ্যা করেছি তা হারানো শেষ করে।
Throwable
বন্ধ Handler
করার s থেকে Formatter
বেশি আমি এখানে তালিকাবদ্ধ করেছি 2012 যা Java7 ছিল, মধ্যে s এবং এই ফাংশন ফিরে পর্যন্ত বেশি Java7 হয়েছে প্রায় ডেট;। অত: পর এ J2SE 5.0 javadocs)
try {
}
catch(Exception e) {
StackTraceElement[] traceElements = e.getStackTrace();
//...
}
অথবা
Thread.currentThread().getStackTrace()
আপনি এটি চেষ্টা করতে পারে:
catch(Exception e)
{
StringWriter writer = new StringWriter();
PrintWriter pw = new PrintWriter(writer);
e.printStackTrace(pw);
String errorDetail = writer.toString();
}
স্ট্রিং 'ত্রুটি-বিবরণ' স্ট্যাকট্রেস ধারণ করে।
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
অ্যারের শেষ উপাদানটি স্ট্যাকের নীচে প্রতিনিধিত্ব করে, যা ক্রমটিতে সাম্প্রতিকতম পদ্ধতির প্রার্থনা method
A StackTraceElement has getClassName(), getFileName(), getLineNumber() and getMethodName().
স্ট্যাকট্রেসএলিমেন্টের মধ্য দিয়ে লুপ করুন এবং আপনার পছন্দসই ফলাফলটি পান।
for (StackTraceElement ste : stackTraceElements )
{
//do your stuff here...
}
আমি উপরের থেকে উত্তরগুলি ব্যবহার করেছি এবং ফরম্যাটিং যুক্ত করেছি
public final class DebugUtil {
private static final String SEPARATOR = "\n";
private DebugUtil() {
}
public static String formatStackTrace(StackTraceElement[] stackTrace) {
StringBuilder buffer = new StringBuilder();
for (StackTraceElement element : stackTrace) {
buffer.append(element).append(SEPARATOR);
}
return buffer.toString();
}
public static String formatCurrentStacktrace() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
return formatStackTrace(stackTrace);
}
}
আপনি যদি আপনার প্রক্রিয়াটির বর্তমান কল স্ট্যাকটি পরীক্ষা করতে চান তবে আপনি jstack ইউটিলিটি ব্যবহার করতে পারেন।
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
এটি একটি পুরানো পোস্ট, তবে এখানে আমার সমাধান:
Thread.currentThread().dumpStack();
আরও তথ্য এবং আরও পদ্ধতি এখানে: http://javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html
Thread.dumpStack()
সরাসরি কল করা উচিত কারণ এটির স্থির পদ্ধতি।
System.out.println(Arrays.toString(Thread.currentThread().getStackTrace()));
এটি আপনাকে লুপ ছাড়াই স্ট্যাক ট্রেস মুদ্রণ করতে সহায়তা করবে।