تحويل BCI (مؤشرات BYTECODE) إلى أرقام سطر الكود المصدر

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

سؤال

أنا أكتب رمز JVMTI إلى ملفات تعريف Java ، والتي تستلزم في الغالب الحصول على آثار المكدس من مؤشرات ترابط عشوائية على فترات زمنية ثابتة باستخدام وظيفة AsyncgetCalltrace. وبالتالي ، أنا قادر على الحصول على هياكل CallTrace ، كل منها يحتوي على مجموعة من هياكل CallFrame ، والتي تحتوي على بيانات حول إطارات فردية في تتبع المكدس. على وجه التحديد ، تتكون هذه البيانات من: jmethodid method_id (معرف طريقة Java حيث يوجد الإطار) ، و: jint lineno (BCI للطريقة في ملف .class ، بقدر ما أفهم الوثائق). لا يمكنني العثور على طريقة لتحويل هذا "Lineno" إلى رقم سطر الكود المصدر المقابل باستخدام إطار JVMTI (انظر الملف jvmti.h ، الموجود في/usr/lib/jvm/java-6-sun/include ، على الأقل ، على الأقل ، على Linux). في الواقع ، حتى خارج إطار JVMTI ، كان الشيء الوحيد الذي يمكن أن أجده على الويب حتى الآن هو هنا: http://jakarta.apache.org/bcel/apidocs/org/apache/bcel/classfile/linenumbertable.html, ، ولكن حتى هذا قد لا يفعل ما أود ، ويتطلب تثبيتًا إضافيًا ، ويتطلب مني معالجة البيانات ، التي تم إنشاؤها بواسطة رمز C ++ JMVTI ، باستخدام برنامج Java منفصل.

إذا كان أي شخص يعرف كيفية تحويل BCI إلى أرقام سطر التعليمات البرمجية من داخل JVMTI (أو حتى بأي شكل من الأشكال) ، الرجاء المساعدة!

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

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

المحلول

أعتقد أنني اكتشفت هذا إلى حد ما. الطريقة الرئيسية لاستخدامها هي jvmti-> getlinenumbertable (...) ، والتي تملأ مجموعة jvmtilinenmumberentry. بالنظر إلى رقم سطر BCI N (الذي يجب تعيينه إلى رقم سطر المصدر) ، يمكن للمرء اختبار INT I IS IS: JVMTILINENTEMBRENTRAY [I] <= n <jvmtilinenmumberentryarray [i + 1]. هذا INT I ثم رقم سطر الكود المصدر المقابل المطلوب.

أحد الصيد هو أن AsyncgetCallTrace ، لسبب ما ، يعيد باستمرار BCIs غريب ، لذلك على الرغم من أن التعيين يعطي دقيق أرقام سطر الكود المصدر ، لا تزال غير كذلك دقيق, ، لأن BCIs الأصلية ليست دقيقة. لماذا هذا ، أنا لا أعرف. كنت آمل في استخدام Sun Studio Profiler ، الذي يستخدم أيضًا AsyncgetCalltrace ، لاختبار ما إذا كانت أرقام الخط المُعود ستكون هي نفسها كما هي بالنسبة إلى Profiler. في هذه الحالة ، تكون وظيفة AsyncgetCalltrace غير دقيقة. ولكن حتى الآن ، تحول استخدام Sun Studio إلى تحدٍ خاص به. إذا كان أي شخص يعرف كيفية استخدام هذه الأداة ، الرجاء المساعدة!

يتمثل الصيد الأكبر في أن أساليب Java غالبًا ما تكون محصورة ، لذا فإن أرقام الأسطر لا تخطط دائمًا بشكل صحيح. في الواقع ، قد يكون هذا هو سبب المشكلة الموضحة في الفقرة أعلاه ، على الرغم من أن هذا يبدو غير مرجح على الأرقام التي أراها. فيما يلي بعض المعلومات حول حل مشكلة الإطالة: http://developer.amd.com/documentation/articles/pages/jvmtieventpiggybacking.aspx

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