بديل من البرامج مثل VisualVM للعثور على قيم تطبيقات Java برمجيا إلخ. من خلال البحث عن مقالب كومة؟

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

سؤال

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

الآن، لقد استخدمت VisualVM (https://visualvm.dev.java.net/) وهو رائع. يمكنني تحديد عملية Java الخاصة بي وإنشاء تفريغ كومة. ثم يظهر لي كل الطبقات وقيمها.

هل يمكنني استخدام هذه الطريقة لاستطلاع باستمرار على تفريغ الكومة واستقبال قيم الكائنات، على سبيل المثال XY و Z من لعبة؟ كيف يمكنني التفاعل برمجيا مع هذا التطبيق، وإذا لم يتم ذلك مع VisualVM، فماذا سيكون بديلا؟

تحرير: هذا هو ما أحتاج إلى القيام به:أحتاج إلى أن أكون قادرا على العثور على جميع الطبقات ذات الخصائص التي لها قيمة معينة. على سبيل المثال: سأبحث عن الإحداثيات X (تعويم) ويجب عليه إرجاع الفئة "playercoordshandler" (مجرد مثال) وتعويم المقابل مع قيمةها ... أو بدلا من ذلك مجرد وسيلة للعثور على هذا التعويم نفسه مرة أخرى (بعد إعادة التشغيل على سبيل المثال). لا يجب أن تكون هذه العملية برنامج برمجيات، كما طلب قيمة العقار المعروف الآن (x تعويم) برمجيا (على سبيل المثال مع أداة مساعدة لسطر الأوامر أو قراءة من ملف).

Edit2:التطبيق الهدف هو نظام Windows قابل للتنفيذ (ولكن مصنوع مع Java) وإطلاقه هو Java VM الخاص. لا يمكن إضافة معلمات Java لتصحيح الأخطاء. لا يبدو أن هذا مطلوب على الرغم من أن Virtualvm قادر على تصحيح العملية على ما يرام. أي شخص يعرف كيف؟

شكرا لك مقدما.

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

المحلول

يبدو أنك تريد تصحيح تطبيق تطبيقات Java.

مصحح جافا الرسمي هو JDB. أعتقد أنه جزء من JDK. لديها القدرة على تعيين نقاط التوقف، وفحص أكوام، وقائمة وعرضها وحتى تغيير المتغيرات، إظهار خيوط التشغيل وما إلى ذلك. الاشياء المصحح المعتادة. لكن سطر الأوامر، مما يجعلها ألم في الرقبة للعمل معها.

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

قد لا ترغب في تشغيل تطبيق Java الخاص بك داخل IDE؛ أو قد يتم تشغيله في خادم تطبيقات الويب. لا توجد مشكلة بالنسبة إلى JDB أو Eclipse (أو غيرها من المعالم الأخرى، مثل Netbeans أو فكرة Intellij): يمكنهم الاتصال ب JVM قيد التشغيل وتصحيح الأخطاء عن بعد مع نفس المستوى من الراحة.

برنامج تصحيح مثل هذا، عن بعد أو غير ذلك، يعمل ببطء إلى حد ما مما لو لم يكن كذلك. سوف تعمل لعبتك، أثناء تصحيحها، في FPS سيئة المظهر؛ ولكن لا يزال ينبغي أن يستجيب أكثر أو أقل عادة لتفاعل اللعب.


تصحيح الأخطاء عن بعد:

لتكون قادرة على إرفاق الخاص بك كسوفNetbeans Debugger إلى عملية Java قيد التشغيل تحتاج إلى بدء هذه العملية مع خيارات Java التالية ...

-Xdebug -Xrunjdwp:transport=dt_socket,address=3704,server=y,suspend=n

نصائح أخرى

القي نظرة على yourkit.. وبعد يمكنك مراقبة وحدة المعالجة المركزية والذاكرة والخيوط الحية، وتوليد مقالب كلما أردت. يمكن أن تقارن المزيد من مقالب الذاكرة المختلفة لتظهر لك الكائنات التي تمت إضافتها / إزالتها.

انها ليست حرة رغم ذلك، فإن لديها 15 يوما (أو 30 يوما؟) فترة التقييم الوظيفية بشكل كامل. إذا كان الحرة ليست مصدر قلق حقيقي فهذا بالتأكيد أداة رائعة.

أنا نقطة انطلاق جيدة هي jps و jstat وأضاف الأدوات في Java 6 (أعتقد). jps يمنحك PID والطبقة الرئيسية لكل تطبيق. jstat تعطيك المزيد من التفاصيل حول العملية

يؤدي تشغيل برنامج HeapDump إلى تحليل ما بعد الوفاة لتقول تسرب الذاكرة، ولكن كما يتحرك جامع Java Garbage الكائنات حولها، لا يمكنك استخدام قيم الذاكرة من HeapDump إلى الوصول إلى هذه الكائنات بشكل موثوق.

إذا كنت بحاجة إلى طريقة لاستعلام القيم الداخلية من خارج التطبيق، فيمكنك النظر في إعداد API لخدمة RMI التي يمكنك استرداد القيم التي تحتاجها.

طريقة أخرى (إذا كنت بحاجة فقط إلى اختبار شيء ما)، يمكن أن يكون الاتصال بالعملية عبر API De Java Debugging.

إذا كنت تعرف موقع JRE المستخدمة، فيمكنك إعادة تسمية Java.exe واكتب غلاف (c / c ++) يضيف خيارات التصحيح التي تم تسرها بواسطة Carl وتدعي ReNamed_Java.exe بدوره.

قد تكون أوائل أخرى لإضافة أو تحديث الفصول في .jar ملف التطبيق. أنت لا تحتاج إلى المصدر للقيام بذلك.

توم، هل تحاول عكس مهندس تطبيق يحاول تحديدا على وجه التحديد عن عمله؟ إذا كان الأمر كذلك، فقد تحصل على أبعد من ذلك، إذا اتصلت بالشركة المصنعة واسألهم عن الاحتمالات التي يرونها ما تحاول تحقيقه؟

يمكنك بسهولة إنشاء تفريغ كومة من خلال إنشاء اتصال JMX الخاص بك إلى JVM، تماما مثل VisualVM يفعل ذلك. تحليل heapdump هو ممكن جدا (البيانات موجودة ومخلصة تماما من JVM لذلك لا يوجد أي تدخل من GC).

ومع ذلك، إلا إذا كان سيناريو محددا للغاية، فأنت تبحث عنك، فربما أفضل بكثير من إعطاء HeapDump حصيرة والعثور على سير عمل جيد هناك لاستخدامها.

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

Edit2: بناء على تعديلاتك، يبدو لي وكأنك يمكنك الاستفادة حقا من نشر MBean الخاص بك على JMX. لا بد لي من الركض من أجل اجتماع ولكن ما لم يفعله شخص آخر أثناء الأمر، سأحاول أن أتذكر أن أعطيك بعض المؤشرات في وقت لاحق. إما في تحرير هذا واحد أو في منشور جديد.

إذا كنت ترغب في استطلاع قيم كائنات محددة أثناء تشغيل تطبيق Java الخاص بك، فمن المحتمل أن تجد ذلك باستخدام JMX. هو نهج أفضل وأكثر كفاءة بدلا من استخدام تفريغ كومة. مع JMX، يمكنك تحديد القيم التي يجب كشفها واستخدام الأدوات مثل VisualVM أو JCONSOLE لعرضها في وقت التشغيل.

باستخدام VisualVM و Heapdump، يمكنك العثور على جميع الفئات مع خاصية معينة بواسطة OQL:

var out = "";
var cls = filter(heap.classes(), "/java./(it.name)")

while (cls.hasNext()) {
  var cl = cls.next();
  var fls = cl.fields;
  while (fls.hasMoreElements()) {
    var fl = fls.nextElement();
    if (/size/(fl.name)) {
      out = toHtml(cl) + "." + fl.name + "()\n";
    }
  }
}

out.toString()

وكتابة تسجيل مخصص ل BTRACE.

إنه بديل لتصحيح الأخطاء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top