logo

تجزئة خطأ الأساسية ملقاة أوبونتو

ما هو خطأ التجزئة؟

خطأ تجزئة أو انتهاك وصول ( com.segfault باختصار) هي حالة فشل أو خطأ ينشأ عن جهاز مزود بحماية للذاكرة، لتنبيه نظام التشغيل الذي حاول البرنامج الوصول إلى منطقة ذاكرة مقيدة (انتهاك الوصول إلى الذاكرة).

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

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

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

نظرة عامة على خطأ التجزئة

  • يظهر خطأ التجزئة عندما يحاول أي برنامج الوصول إلى موقع ذاكرة غير مسموح له بالوصول إليه أو يحاول الوصول إلى موقع ذاكرة بطريقة غير مسموح بها (على سبيل المثال، محاولة الكتابة إلى موقع للقراءة فقط، أو الكتابة فوق موقع الذاكرة). جزء من نظام التشغيل).
  • في الحوسبة، الكلمة 'التجزئة' له عدة استخدامات. في طريقة خطأ التجزئة، وهي كلمة تستخدم منذ عام 1950، تحدد مساحة عنوان البرنامج، فقط مساحة عنوان البرنامج قابلة للقراءة مع حماية الذاكرة، ومن هذا، فقط جزء القراءة والكتابة للمكدس ومقطع البيانات من البرنامج قابل للكتابة. ومن ثم، فإن محاولة القراءة خارج مساحة عنوان البرنامج، أو الكتابة إلى الجزء المخصص للقراءة فقط من مساحة العنوان يؤدي إلى حدوث خطأ تجزئة.
  • يظهر خطأ التجزئة إذا وجد الجهاز محاولة للإشارة إلى مقطع غير موجود، أو موقع خارج حدود المقطع، أو موقع بنمط غير مسموح به من خلال الأذونات الممنوحة للمقطع على الأنظمة التي تستخدم تجزئة الذاكرة الأجهزة لتوفير الذاكرة الافتراضية.
  • بشكل عام، يؤدي خطأ الصفحة غير الصالح إلى حدوث خطأ تجزئة على الأنظمة التي تستخدم الترحيل فقط. تعد أخطاء الصفحة وأخطاء التجزئة أخطاء ناشئة عن نظام إدارة الذاكرة الظاهرية. كما يمكن أن يحدث خطأ التجزئة بشكل مستقل عن أخطاء الصفحة؛ الوصول غير المشروع إلى أي صفحة صالحة هو خطأ التجزئة. يمكن أن يظهر خطأ التجزئة في منتصف الصفحة. داخل تجاوز سعة المخزن المؤقت الموجود في الصفحة ولكنه يقوم بالكتابة فوق الذاكرة بشكل غير قانوني على سبيل المثال.
  • في البداية، ينشأ الخطأ من MMU ( وحدة إدارة الذاكرة ) على الوصول غير القانوني، كجزء من جانب حماية الذاكرة، أو خطأ صفحة غير صالح على مستوى الأجهزة. إذا لم تكن المشكلة عنوانًا منطقيًا غير صالح، بل عنوانًا فعليًا غير صالح، فسيظهر خطأ الناقل بدلاً من ذلك. لذلك، هذه ليست دائما مميزة.
  • تم العثور على هذا الخطأ ويتم إرسال إشارة إلى العملية المخالفة، مما يؤدي إلى تشغيل معالج العملية لتلك الإشارة على مستوى نظام التشغيل. تحتوي الأنواع المختلفة من أنظمة التشغيل على أسماء إشارات مميزة للإشارة إلى ظهور خطأ في التجزئة.
  • إشارة تعرف باسم SIGSEGV (باختصار ل انتهاك التجزئة ) إلى العملية المخالفة على أنظمة التشغيل المشابهة لـ Unix. تحصل عملية المخالفة على استثناء، أي: STATUS_ACCESS_VIOLATION على مايكروسوفت ويندوز.

أسباب خطأ التجزئة

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

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

كثافة العمليات إلى السلسلة

فيما يلي بعض الأسباب النموذجية لخطأ التجزئة:

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

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

حل خطأ التجزئة في أوبونتو

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

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

حرف إلى سلسلة

قد نقوم بتصحيح الأخطاء أو التراجع لحلها ولكن الحل هو إصلاح الحزم المعطلة من خلال تنفيذ بعض الخطوات المذكورة على النحو التالي:

1. قم بإزالة ملفات القفل المتوفرة في مواقع مختلفة.

 $ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system 

تجزئة خطأ الأساسية ملقاة أوبونتو

2. إزالة ذاكرة التخزين المؤقت للمستودع.

 $ sudo apt-get clean all 

تجزئة خطأ الأساسية ملقاة أوبونتو

3. ترقية وتحديث ذاكرة التخزين المؤقت لمستودعنا.

 $ sudo apt-get update 

تجزئة خطأ الأساسية ملقاة أوبونتو
 $ sudo apt-get upgrade 

تجزئة خطأ الأساسية ملقاة أوبونتو

4. الآن قم بترقية توزيعتنا وسوف تقوم بتحديث حزمنا.

xor ج++
 $ sudo apt-get dist-upgrade 

تجزئة خطأ الأساسية ملقاة أوبونتو

5. تفتيش الطرود المكسورة وإزالتها بالقوة.

 $ sudo dpkg -1 | grep ^..r | apt-get purge 

الطريقة الرائعة التي ستعمل دائمًا هي كما يلي بصرف النظر عن سطر الأوامر:

تم إنشاء مثيل لجافا
  1. في وضع بدء التشغيل، قم بتشغيل Ubuntu بالنقر فوق خروج المفتاح بعد إعادة التشغيل.
  2. يختار ' خيارات متقدمة لأوبونتو
    تجزئة خطأ الأساسية ملقاة أوبونتو
  3. في وضع الاسترداد، قم بتشغيل Ubuntu وسيتم ذكر عدة خيارات.
  4. أولا، اختر 'إصلاح الطرود المكسورة'
    تجزئة خطأ الأساسية ملقاة أوبونتو
  5. ثم اختر 'استئناف التمهيد العادي'
    تجزئة خطأ الأساسية ملقاة أوبونتو

الآن، لدينا طريقتان لحل خطأ التجزئة في واجهة المستخدم الرسومية وواجهة سطر الأوامر. في بعض الأحيان، قد يحدث أيضًا أن الأمر، أي apt، لا يعمل بسبب خطأ com.segfault ، لذلك لن يتم تنفيذ طريقة CLI. في هذه الحالة، لا تقلق لأن طريقة واجهة المستخدم الرسومية ستعمل دائمًا لصالحنا.

معالجة خطأ التجزئة

المهمة الافتراضية لخطأ الناقل أو خطأ التجزئة هي الإنهاء غير الطبيعي للعملية التي واجهتها. قد يتم إنتاج ملف أساسي للمساعدة في تصحيح الأخطاء، وقد يتم أيضًا تنفيذ مهام أخرى تعتمد على النظام الأساسي. على سبيل المثال، العديد من أنظمة Linux التي تطبق تصحيح grsecurity قد يسجل إشارات SIGSEGV لرصد محاولات التطفل المحتملة مع تجاوزات المخزن المؤقت.

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

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

في هذه الحالة، عندما يسمح النظام بذلك، من الممكن إدارة الحدث وتعزيز عداد برنامج المعالج 'القفز' على التعليمات الفاشلة لمواصلة التنفيذ.

إصدارات أندرويد

أمثلة على خطأ التجزئة

تجزئة خطأ الأساسية ملقاة أوبونتو

الكتابة إلى ذاكرة القراءة فقط

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

عدم مرجعية المؤشر الفارغ

في لغة C وغيرها من اللغات المشابهة لـ C، يتم استخدام المؤشرات الفارغة للمعنى 'مؤشر إلى لا شيء' وبما أن مؤشر الخطأ وإلغاء الإشارة في المؤشر الفارغ (الكتابة أو القراءة من مؤشر فارغ) يعد خطأً أساسيًا في البرنامج.

لا يشير المعيار إلى أن المؤشر الفارغ يشبه المؤشر إلى عنوان الذاكرة 0، على الرغم من أن هذا قد يكون هو الحال. تقوم جميع أنظمة التشغيل تقريبًا بتعيين عنوان المؤشر الفارغ بحيث يؤدي استخدامه إلى خطأ في التجزئة.

لا يتم ضمان هذا السلوك بواسطة أي معيار C. في C، إلغاء الإشارة إلى المؤشر الفارغ هو سلوك غير محدد ، ويُسمح للتنفيذ المطابق بافتراض أن المؤشر الذي تم إلغاء الإشارة إليه ليس فارغًا.

تجاوز سعة المخزن المؤقت

تجاوز سعة المكدس