سؤال

قضيت آخر 4 ساعات في محاولة لإعداد التنميط بين ذاكرة TPTP Eclipse على مثيل Tomcat الذي يجب تشغيله عن بُعد (أي ليس في Eclipse). يجب أن يكون هذا ممكنًا وفقًا لمستندات وحدة تحكم TPTP و Agent.

لقد قمت بتثبيت مكونات TPTP (4.6.0) في طاولة عمل Eclipse (Galileo) ، إلى جانب وحدة تحكم الوكيل وفقًا للتعليمات الموجودة على الموقع. لتمكين الوكيل ، أضفت الخيارات التالية إلى سطر الأوامر الذي يبدأ مثيل Tomcat:

-agentlib:JPIBootLoader=JPIAgent:server=enabled;HeapProf:allocsites=true

وأضاف الدلائل التالية إلى مقدمة المسار:

D:\dev\tools\ac\plugins\org.eclipse.tptp.javaprofiler
D:\dev\tools\ac\bin

عند محاولة بدء Tomcat ، تلقيت باستمرار رسالة الخطأ التالية:

ERROR: JDWP unable to get necessary JVMTI capabilities. ["debugInit.c",L279]

لقد فعلت الكثير من Googling لكنني لم أجد شيئًا ذا صلة ؛ حاولت إعادة تثبيت TPTP وإصدارات مختلفة من وحدة تحكم الوكيل.

في النهاية ، تبين أن المشكلة هي أنني بدأت Tomcat مع خيار "JPDA" ، والذي يترجمه Catalina.bat إلى

-Xdebug -Xrunjdwp:transport=.....

تسببت إزالة وسيطة القيادة "JPDA" في بدء تشغيل JVMTI.

لذا ، فإن السؤال هو: لم أجد شيئًا خلال أي من عمليات البحث الخاصة بي للإشارة إلى أن وكيل JVMTI غير متوافق مع تصحيح الأخطاء. هل يمكن لأحد أن يشرح ما يجري ولماذا JVMTI + JDWP ليس إعدادًا صالحًا؟

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

المحلول

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

JVMTI و JDWP فعل العمل معًا ، في الواقع يجب استخدامها معًا بشكل عام. ستحصل ERROR: JDWP unable to get necessary JVMTI capabilities لو -Xrunjdwp (و/أو ربما -agentlib:jdwp) يتم تحديد أكثر من مرة على سطر الأوامر. لإصلاحه ، تأكد من أن لديك واحدة فقط من -Xrunjdwp أو -agentlib:jdwp في سطر الأوامر الخاص بك.

لمزيد من التفاصيل ، اقرأ ...

JVMTI (واجهة أداة الجهاز الافتراضي Java) هي خليفة لـ JVMDI (واجهة تصحيح الجهاز الظاهري Java) و JVMPI (واجهة التنميط الجهاز الافتراضية Java). إنه يشتمل على وظائف كل من JVMDI و JVMPI ، وكلاهما تم إهمالهما في Java 5 وتم إزالته في Java 6. إنه API الذي يعرض الداخلية من JVM لأغراض تصحيح التصحيح والتنميط.

JDWP (بروتوكول سلك Debug Java) هو بروتوكول يصف آلية بسيطة لنقل الأوامر والاستجابات. على حد علمي ، فهذه هي الطريقة الوحيدة لمصحح الأخطاء التي تجلس خارج JVM للتواصل معها والتفاعل مع JVMTI.

JDI (Java Debugger Interface) هي واجهة برمجة تطبيقات من جانب العميل (Debugger) والتي تكشف بعض ميزات JVMTI مع الاستفادة من JDWP أكثر أو أقل شفافية.

ال خلل برمجي تتعلق إجابة بوب دوبس برسالة الخطأ المضللة ، وحقيقة أن JVM سيحاول تحميل JDWP مرة واحدة في كل مرة يتم فيها تحديدها على سطر الأوامر. لا ينص في أي مكان لا يمكن استخدام JDWP و JVMTI معًا.

مزيد من المعلومات هنا: https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_74/rzaha/jpdebuga.htm

نصائح أخرى

واجهت نفس المشكلة مثلك ، لكنني توصلت إلى تقرير JVM Bug (http://bugs.sun.com/bugdatabase/view_bug.do؟bug_id=6354345) التي ألقت بعض الضوء على هذه القضية. إنه ينزل بشكل أساسي إلى مكتبة وكيل Java التي لم يكن من المفترض أن يتم تحميلها مرتين في نفس VM. تمتص ، ولكن يبدو أنه قيود أساسية لنظام الوكيل الذي لا يمكنك القيام بهما في نفس الوقت.

بالنسبة لي ، كانت نفس المشكلة مثل Code Bling Post ، لقد كانت مكررة -Xrunjdwp لم يدرك أن هناك ثانية -Xrunjdwp كما كان مخفيا في المتغير %JAVA_OPTIONS%, ، تحقق من البرنامج النصي لخادم التطبيق الخاص بك.

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