كيفية تشخيص / تتبع "SENDSIG: فشل المستخدم." مشكلة في HP-UX

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

  •  23-08-2019
  •  | 
  •  

سؤال

أحاول ترجمة روبي 1.9.1-P0 على HP-UX. بعد تغيير صغير إلى تحويلة / pty.c يجمع بنجاح، وإن كان مع كثيرا من رسائل التحذير (حوالي 5K). عندما أقوم بتشغيل الاختبارات الذاتية باستخدام "إجراء اختبار" تعطل وتصفيات الأساسية مع الخطأ التالي:

SendSig: فشل مستخدمي المستخدم. 0x9FFFFFFFFDAE00 0x00000000005000.

قتل PID 3044 بسبب الفشل في كتابة سياق الإشارة - سعة مكدس محتملة.

التعليم غير القانوني

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

يشبه إخراج BackTrace Backtrace GDB:

#0  0xc00000000033a990:0 in __ksleep+0x30 () from /usr/lib/hpux64/libc.so.1
#1  0xc0000000001280a0:0 in __mxn_sleep+0xae0 ()
    from /usr/lib/hpux64/libpthread.so.1
#2  0xc0000000000c0f90:0 in <unknown_procedure> + 0xc50 ()
    from /usr/lib/hpux64/libpthread.so.1
#3  0xc0000000000c1e30:0 in pthread_cond_timedwait+0x1d0 ()
    from /usr/lib/hpux64/libpthread.so.1
هل كانت مفيدة؟

المحلول

الإجابة على سؤالي:

كانت المشكلة هي أن المكدس التي يتم تخصيصها كانت صغيرة جدا. لذلك كان حقا تجاوز سعة مكدس. كانت وظيفة SendSig () تحضير بنية سياق سيتم نسخها من مساحة Kernel إلى مساحة المستخدم. يتحقق الدالة Uperacc () أن هناك مساحة كافية على العنوان المحدد للقيام بذلك.

كان رمز Ruby 1.9.1-P0 يستخدم pthread_stack_min لتخصيص المكدس لأي مواضيع تم إنشاؤها. وفقا لتوثيق HP-UX، على Itanium هذا هو 256 كيلو بايت، ولكن عندما راجعت ملفات الرأس، كان 4KB فقط. أشارت رسالة الخطأ من UserAcc () إلى أنها كانت تحاول نسخ 20 كيلو بايت.

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

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