طباعة مكدس الاستدعاءات الكامل على printStackTrace ()؟

StackOverflow https://stackoverflow.com/questions/1043378

  •  20-08-2019
  •  | 
  •  

سؤال

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

في حالة وجود استثناء في السجل، أحتاج إلى جمع معلومات مجمعة حول الأساليب المستخدمة على طول تتبع المكدس من الأعلى إلى المكان الفعلي للاستثناء.

لسوء الحظ، بشكل افتراضي Java printStackTrace() لا يطبع كل الأساليب في مكدس الاستدعاءات ولكن ما يصل إلى رقم معين ويتم الإشارة إلى الباقي على أنه 16 more....

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

هل هناك طريقة لمطالبة Java بطباعة مكدس الاستدعاءات بالكامل في تتبع المكدس؟

بصرف النظر عن وضعي، هل لدى أطر التسجيل الشائعة خيار لذلك؟

يحرر: يعمل البرنامج على Sun's JVM مع JDK 1.5.0_09.لا يوجد خيار لتغيير ذلك.

هل كانت مفيدة؟

المحلول

هنا شرح من "السبب في" و "... ن المزيد من الخطوط في التتبع المطبوع.انظر أيضا JavaDoc لـ printStackTrace.قد لا يكون لديك أي عمل للقيام به.

لاحظ وجود أسطر تحتوي على الحرف "...".تشير هذه الأسطر إلى أن باقي تتبع المكدس لهذا الاستثناء يطابق عدد الإطارات المشار إليه من أسفل تتبع المكدس للاستثناء الذي سببه هذا الاستثناء (الاستثناء "المرفق").يمكن أن يؤدي هذا الاختصار إلى تقليل طول الإخراج بشكل كبير في الحالة الشائعة حيث يتم طرح استثناء ملتف من نفس الطريقة التي يتم بها اكتشاف "الاستثناء المسبب".

نصائح أخرى

لا يمكنك أن تفعل شيئا مع Thread.currentThread().getStackTrace()?

فيما يلي مثال بسيط حقيقي يستدعي طريقة بشكل متكرر 20 مرة ثم يتخلص من مكدس مؤشر الترابط الحالي.

public class Test {
    public static void main(String[] args) {
        method();
    }

    static int x = 0;
    private static void method() {
        if(x>20) {
            StackTraceElement[] elements = Thread.currentThread().getStackTrace();

            for(int i=0; i<elements.length; i++) {
                System.out.println(elements[i]);
            }
        }
        else {
            x++;
            method();
        }
    }
}

ربما يمكنك محاولة التكرار على المصفوفة التي يتم إرجاعها بواسطة:

Thread.currentThread().getStackTrace();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top