java - كلاس - هل هناك طريقة لتفريغ تتبع بنية تخزين العناصر دون طرح استثناء في جافا؟



انواع exception في الجافا (6)

إذا كنت بحاجة إلى التقاط الإخراج

StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();

https://src-bin.com

أفكر في إنشاء أداة تصحيح لتطبيق جافا الخاص بي.

أنا أتساءل إذا كان من الممكن الحصول على تتبع مكدس ، مثل Exception.printStackTrace() ولكن دون بالفعل طرح استثناء؟

هدفي هو ، في أي طريقة معينة ، تفريغ كومة لمعرفة من هو الأسلوب المتصل.


Answer #1

إذا كنت تريد تتبع فقط لمؤشر الترابط الحالي (بدلاً من كافة مؤشرات الترابط الموجودة في النظام ، كما يفعل اقتراح Ram) ، فقم بما يلي:

Thread.currentThread (). getStackTrace()

للعثور على المتصل ، قم بما يلي:

private String getCallingMethodName() {
    StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
    return callingFrame.getMethodName();
}

واستدعاء هذه الطريقة من داخل الطريقة التي تحتاج إلى معرفة من هو المتصل. ومع ذلك ، كلمة تحذير: قد يختلف مؤشر إطار الاتصال داخل القائمة وفقًا لـ JVM! كل هذا يتوقف على عدد طبقات المكالمات الموجودة داخل getStackTrace قبل أن تصل إلى النقطة التي يتم فيها إنشاء التتبع. سيكون الحل الأكثر قوة هو الحصول على التتبع ، ثم التكرار فوقه بحثًا عن الإطار الخاص بـ getCallingMethodName ، ثم اتخاذ خطوتين حتى تصل إلى العثور على المتصل الحقيقي.


Answer #2

لاحظ أن Thread.dumpStack () بالفعل يطرح استثناء:

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

Answer #3

نعم ، ببساطة استخدام

Thread.dumpStack()

Answer #4

يمكنك أيضًا محاولة Thread.getAllStackTraces() للحصول على خريطة تتبعات المكدس لكافة مؤشرات الترابط Thread.getAllStackTraces() .


Answer #5

يمكنك الحصول على تتبع مكدس مثل هذا:

Throwable t = new Throwable();
t.printStackTrace();

إذا كنت تريد الوصول إلى الإطار ، يمكنك استخدام t.getStackTrace () للحصول على صفيف من إطارات المكدس.

يجب أن تدرك أن هذا stacktrace (تماماً مثل أي الأخرى) قد يكون مفقودًا بعض الإطارات إذا كان المحول البرمجي نقطة فعالة مشغولاً تحسين الأشياء.





stack-trace