উত্তর:
হ্যাঁ, সহজভাবে ব্যবহার করুন
Thread.dumpStack()
public static void dumpStack() { new Exception("Stack trace").printStackTrace(); }
stderr
, যা মনে হয় প্রশ্নের জড়িত বলে মনে হচ্ছে।
আপনি যদি কেবলমাত্র বর্তমান থ্রেডের জন্য ট্রেস চান (সিস্টেমের সমস্ত থ্রেডের চেয়ে, রামের পরামর্শ অনুসারে), করুন:
Thread.currentThread ()। getStackTrace ()
কলার সন্ধান করতে, করুন:
private String getCallingMethodName() {
StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
return callingFrame.getMethodName();
}
এবং সেই পদ্ধতিটিকে সেই পদ্ধতির মধ্যে থেকেই কল করুন যার জন্য এটির আহ্বায়ক কে তা জানতে হবে। তবে, সতর্কতার একটি শব্দ: তালিকার মধ্যে কলিং ফ্রেমের সূচিটি জেভিএম অনুসারে পরিবর্তিত হতে পারে! এটি সমস্তই নির্ভর করে যে আপনি যে বিন্দুতে ট্রেস তৈরি করেছেন সেখানে আঘাত করার আগে getStackTrace এর মধ্যে কলগুলির কত স্তর রয়েছে on আরও শক্তিশালী সমাধান হ'ল ট্রেসটি পাওয়া এবং গেটকলিংথমেডনামের ফ্রেম সন্ধান করার জন্য এটি পুনরুক্ত করা, তারপরে সত্যিকারের কলার সন্ধানের জন্য আরও দুটি পদক্ষেপ নেওয়া।
আপনি এই জাতীয় স্ট্যাক ট্রেস পেতে পারেন:
Throwable t = new Throwable();
t.printStackTrace();
আপনি যদি ফ্রেমটি অ্যাক্সেস করতে চান তবে স্ট্যাক ফ্রেমের অ্যারে পেতে আপনি t.getStackTrace () ব্যবহার করতে পারেন।
হটস্পট সংকলক জিনিসগুলির অনুকূলকরণে ব্যস্ত থাকলে এই স্ট্যাকট্রেসটি (অন্যগুলির মতো) কিছু ফ্রেম অনুপস্থিত হতে পারে তা অবগত থাকুন।
t.printStackTrace
সঙ্গে t.printStackTrace(System.out)
।
log.log(Level.SEVERE, "Failed to do something", new Throwable());
লক্ষ্য করুন যে থ্রেড.ডম্পস্ট্যাক () আসলে একটি ব্যতিক্রম ছুঁড়েছে:
new Exception("Stack trace").printStackTrace();
আপনি চলমান জাভা প্রক্রিয়াতে প্রসেসটিতে একটি কুইট সিগন্যাল প্রেরণ করে থ্রেড.জেটএলস্ট্যাকট্রেসেস () চালানোর জন্য আপনি জেভিএমকে সংকেত পাঠাতে পারেন।
ইউনিক্স / লিনাক্স ব্যবহারে:
kill -QUIT process_id
, যেখানে প্রক্রিয়া_আইডি হ'ল আপনার জাভা প্রোগ্রামের প্রক্রিয়া নম্বর।
উইন্ডোজে আপনি অ্যাপ্লিকেশনটিতে Ctrl-Break টিপতে পারেন, যদিও আপনি কনসোল প্রক্রিয়া চালা না করে আপনি সাধারণত এটি দেখতে পাবেন না।
জেডি কে another আরও একটি বিকল্প চালু করেছে, জেস্ট্যাক কমান্ড, যা আপনার কম্পিউটারে চলমান জেডিকে process প্রক্রিয়া থেকে স্ট্যাকটি প্রদর্শন করবে:
jstack [-l] <pid>
এই বিকল্পগুলি অ্যাপ্লিকেশনগুলির জন্য খুব দরকারী যা একটি উত্পাদন পরিবেশে চলছে এবং সহজেই পরিবর্তন করা যায় না। রানটাইম ডেডলকগুলি বা পারফরম্যান্স সমস্যা নির্ণয়ের জন্য এগুলি বিশেষত কার্যকর।
http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/ http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html
আপনার যদি ক্যাপচার আউটপুট প্রয়োজন
StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();
জাভা 9 StackWalker
স্ট্যাকটি হাঁটার জন্য এবং সহায়ক ক্লাসগুলি চালু করেছিল ।
জাভাডোকের কয়েকটি স্নিপেট এখানে রয়েছে:
walk
পদ্ধতির একটি অনুক্রমিক প্রবাহ প্রর্দশিতStackFrames
বর্তমান থ্রেড জন্য এবং তারপর হেঁটে যাওয়ার দেওয়া ফাংশন প্রযোজ্যStackFrame
স্ট্রীম। স্ট্রিমটি স্ট্যাক ফ্রেম উপাদানগুলিকে যথাযথভাবে প্রতিবেদন করে, শীর্ষ সর্বাধিক ফ্রেম থেকে যা কার্যকরভাবে পয়েন্ট উপস্থাপন করে যেখানে স্ট্যাকটি নীচে সবচেয়ে ফ্রেমে তৈরি করা হয়েছিল।StackFrame
ওয়াক পদ্ধতিটি ফিরে আসার পরে স্ট্রিমটি বন্ধ হয়ে যায়। যদি বন্ধ স্ট্রিমটি পুনরায় ব্যবহার করার চেষ্টা করা হয়IllegalStateException
তবে ফেলে দেওয়া হবে।...
বর্তমান থ্রেডের শীর্ষ 10 স্ট্যাক ফ্রেমের স্ন্যাপশট করতে,
List<StackFrame> stack = StackWalker.getInstance().walk(s -> s.limit(10).collect(Collectors.toList()));
আপনাকে কোডেও এটি করতে হবে না। আপনি নিজের প্রক্রিয়াটির সাথে জাভা এইচপিআরএফ সংযুক্ত করতে পারেন এবং যে কোনও মুহুর্তে হিপ ডাম্প আউটপুট, চলমান থ্রেড ইত্যাদিতে নিয়ন্ত্রণ- hit চাপুন hit । । আপনার অ্যাপ্লিকেশন কোড চূড়ান্ত না করে। এটি কিছুটা পুরানো, জাভা 6 জিইউআই জকনসোলের সাথে আসে তবে আমি এখনও এইচপিআরএফকে খুব দরকারী বলে মনে করি।
রব ডি মার্কো দ্বারা উত্তর দ্বারা পর্যন্ত সেরা যদি আপনি আউটপুট খুশি stderr
।
আপনি যদি String
কোনও সাধারণ ট্রেস অনুসারে নতুন লাইনের সাথে একটিতে ক্যাপচার করতে চান তবে আপনি এটি করতে পারেন :
Arrays.toString(Thread.currentThread().getStackTrace()).replace( ',', '\n' );