كيف تكتب بشكل صحيح معالج Sigprof الذي يستدعي AsyncgetCalltrace؟

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

سؤال

أنا أكتب ملفًا قصيرًا وبسيطًا (في C) ، والذي يهدف إلى طباعة آثار المكدس للخيوط في مختلف عملاء Java على فترات منتظمة. لا بد لي من استخدام الوظيفة غير الموثقة AsyncgetCallTrace بدلاً من GetStackTrace لتقليل التسلل والسماح بتتبع المكدس بغض النظر عن حالة الخيط. يمكن العثور على الكود المصدري للوظيفة هنا: http://download.java.net/openjdk/jdk6/promoted/b20/openjdk-6-src-b20-21_jun_2010.tar.gzفي نقطة الساخنة/src/share/vm/prims/forte.cpp. لقد وجدت بعض صفحات الرجل التي توثق JVMTI ، ومعالجة الإشارات ، والتوقيت ، بالإضافة إلى مدونة مع تفاصيل حول كيفية إعداد مكالمة AsyncgetCalltrace: http: // jeremymanson.blogspot.com/2007/05/profiling-fmtijvmpi- SIGPROF-and.HTML.

ما تفتقده هذه المدونة هو الكود الذي يستدعي فعليًا الوظيفة داخل معالج الإشارة (يفترض المؤلف أن القارئ يمكنه القيام بذلك بمفرده). أنا أطلب المساعدة في القيام بذلك بالضبط. لست متأكدًا من كيفية ومكان إنشاء struct asgct_calltrace (و struct struct asgct_callframe الداخلي) ، على النحو المحدد في الملف المذكور أعلاه forte.cpp. struct asgct_calltrace هي واحدة من المعلمات التي يتم تمريرها إلى AsyncgetCallTrace ، لذلك أنا بحاجة إلى إنشائها ، لكنني لا أعرف كيفية الحصول على القيم الصحيحة لحقولها: Jnienv *env_id ، Jint num_frames ، و JvMPI_CallFrame إطارات. علاوة على ذلك ، لا أعرف ما الذي تم نقل المعلمة الثالثة إلى AsyncgetCalltrace (void ucontext) من المفترض أن تكون؟

المشكلة أعلاه هي المشكلة الرئيسية التي أواجهها. ومع ذلك ، فإن المشكلات الأخرى التي واجهتها تشمل: [1] لا يبدو أن Sigprof قد أثيرت من قبل المؤقت بالضبط على الفواصل الزمنية المحددة ، بل أقل قليلاً. هذا هو ، إذا قمت بتعيين المؤقت لإرسال sigprof كل ثانية (1 ثانية ، 0 USEC) ، ثم في المدى البالغ 5 ثانية ، أحصل على أقل من 5 مخرجات معالج Sigprof (عادة 1-3) [2] مخرجات معالج Sigprof لا تظهر على الإطلاق أثناء thread.sleep في رمز Java. لذلك ، إذا تم إرسال sigprof كل ثانية ، ولديّ Thread.sleep (5000) ؛ ، فلن أحصل على أي مخرجات معالج أثناء تنفيذ هذا الرمز.

سيكون موضع تقدير أي مساعدة. سيتم نشر تفاصيل إضافية (وكذلك أجزاء من الرمز ومخرجات عينة) عند الطلب.

شكرًا!

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

المحلول

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

يمكن ببساطة إعلان بنية ASGCT_Calltrace (وصفيف ASGCT_CALLFRAME الأساسي الأساسي) في معالج الإشارة ، وبالتالي موجود فقط المكدس: ASGCT_CALLTRACE TRACE ؛ jnienv *env ؛ global_vm_pointer-> actactCurrentThread ((void **) & env ، null) ؛ trace.env_id = env ؛ trace.num_frames = 0 ؛ ASGCT_CallFrame Storage [25] ؛ trace.frames = التخزين ؛

فيما يلي يحصل على ucontext: ucontext_t ucontext ؛ getContext (& ucontext) ؛

ثم المكالمة فقط: AsyncgetCalltrace (& Trace ، 25 ، & uContext) ؛

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

في المسألتين الأخريين: [1] إذا كان الخيط نائمًا وتم إنشاء sigprof ، فإن الخيط يتعامل مع الإشارة فقط بعد الاستيقاظ. هذا أمر طبيعي ، لأنه مهمة الخيط للتعامل مع الإشارة. [2] لا يبدو أن عيوب المؤقت تظهر بعد الآن. ربما أخطأت.

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