Breakpoint — ما هو، أنواع نقاط التوقف واستخدامها في التصحيح

المؤلف: IT Sectr نُشر: 2026-05-06 وقت القراءة: 9 دق

نقطة التوقف (breakpoint) هي علامة خاصة في الكود، عند الوصول إليها يوقف المصحح تنفيذ البرنامج لـ فحص الحالة. وفقًا لـ Apple Debugging Guide، تسمح نقاط التوقف للمطور بعرض قيم المتغيرات، ومكدس الاستدعاءات، وتنفيذ التعليمات خطوة بخطوة دون تعديل الكود المصدري. إنها الأداة الرئيسية لتشخيص الأخطاء وتحليل سلوك التطبيق في الوقت الفعلي.

الخلاصة

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

ما هو Breakpoint ولماذا نحتاجه

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

الهدف الرئيسي من breakpoint هو تحديد مصدر الخطأ. عندما يتصرف التطبيق بشكل غير متوقع، يضع المطور نقطة توقف قبل المقطع المشبوه ويحلل بالتسلسل البيانات التي تدخل، وكيف تتغير المتغيرات، وأي مسار يسلكه التنفيذ. وفقًا لـ Apple، يتم اكتشاف أكثر من 70% من الأخطاء في تطبيقات المحمول بدقة باستخدام نقاط التوقف مع التنفيذ خطوة بخطوة، بدلاً من التحليل الثابت للكود.

لا تؤثر نقاط التوقف على أداء بناء الإصدار — فهي تُترجم فقط في تهيئة Debug. في Xcode، يوجد علم خاص DEBUG يحيط كود التصحيح بتوجيهات المعالج الأولي. وهذا يضمن أن نقاط التوقف لا تصل إلى App Store ولا تبطئ عمل المستخدمين النهائيين.

كيف تعمل آلية التوقف

عندما يصل المعالج إلى سطر محدد بنقطة توقف، يحدث مقاطعة عتادية أو برمجية. في Xcode، تُستخدم آلية SIGTRAP — إشارة تتبع يلتقطها المصحح. LLDB يعلق جميع الخيوط، وينقل التحكم إلى واجهة Xcode، وينتظر أمر المطور: متابعة (continue)، تجاوز (step over)، دخول (step into) أو خروج (step out).

swift
func fetchUserData(userId: Int) {
    // LLDB will stop here if breakpoint is set
    let url = URL(string: "https://api.example.com/user/\(userId)")
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    print("Fetching user \(userId)")
}

في المثال أعلاه، نقطة التوقف الموضوعة على السطر let url = ... تسمح بالتحقق من أي userId تم تمريره إلى الدالة، وما إذا كان URL قد جُمِع بشكل صحيح، وما هي الرؤوس المحددة في الطلب قبل تنفيذ استدعاء الشبكة.

أنواع نقاط التوقف في Xcode

Xcode يوفر خمسة أنواع رئيسية من نقاط التوقف، كل منها يحل مهمة تصحيح محددة. فهم اختلافاتها يسمح باختيار الأداة المثلى لكل موقف وتقليل وقت التشخيص بمقدار 2–3 مرات مقارنة باستخدام نقاط التوقف الخطية فقط.

نوع Breakpointالغرضالتفعيل
Line breakpointتوقف عند سطر محدد من الكودنقر على رقم السطر في المحرر
Conditional breakpointتوقف عند تحقق شرطنقر يمين → Edit Breakpoint → Condition
Symbolic breakpointتوقف عند استدعاء دالة/طريقةBreakpoint Navigator → + → Symbolic Breakpoint
Exception breakpointتوقف عند إلقاء استثناءBreakpoint Navigator → + → Exception Breakpoint
Error breakpointتوقف عند حدوث خطأ (Swift)Breakpoint Navigator → + → Swift Error Breakpoint

Line Breakpoint — النوع الأساسي

Line breakpoint هو النوع الأكثر شيوعًا. يُوضع بنقرة واحدة على رقم السطر في محرر Xcode. عند الوصول إلى ذلك السطر، يتوقف التنفيذ ويمكن للمطور فحص الحالة عبر لوحة Debug Area أو كونسول LLDB. وفقًا لإحصائيات Stack Overflow، أكثر من 85% من مطوري iOS يستخدمون نقاط التوقف الخطية كأداة تصحيح رئيسية، بينما تُستخدم الأنواع الأخرى لسيناريوهات محددة مثل تصحيح مكتبات الطرف الثالث أو التقاط الاستثناءات.

Symbolic Breakpoint — اعتراض استدعاءات الدوال

Symbolic breakpoint يسمح بالتوقف عند استدعاء طريقة أو دالة محددة، حتى لو لم يكن لديك access إلى الكود المصدري لتلك الطريقة. هذا لا يقدر بثمن عند تصحيح أُطر النظام — على سبيل المثال، لاعتراض اللحظة التي يستدعي فيها UIKit الدالة layoutSubviews. يشمل التكوين اسم الرمز (مثل -[UIView layoutSubviews] لـ Objective-C أو UIView.layoutSubviews() لـ Swift) ومعلمات اختيارية: الوحدة والشرط وعدد التجاوزات.

swift
// Symbolic breakpoint to intercept layoutSubviews on UITableView
// Symbol name: -[UITableView layoutSubviews]
// Action: po UITableView.appearance()

class CustomTableView: UITableView {
    override func layoutSubviews() {
        super.layoutSubviews()
        // Symbolic breakpoint here will intercept the call
        print("layoutSubviews called")
    }
}

نقاط التوقف الشرطية وتكوين الإجراءات

نقطة التوقف الشرطية لا تعمل عند كل تنفيذ للسطر، بل فقط عندما يتم تقييم تعبير منطقي محدد إلى true. هذا يوفر وقتًا هائلًا عند تصحيح الحلقات ومعالجة المصفوفات والاستدعاءات العودية — بدلاً من النقر يدويًا على Continue في كل مرة، يحدد المطور شرطًا ويتوقف المصحح فقط في اللحظة المناسبة.

إعداد شرط التوقف

لإضافة شرط، انقر بزر الماوس الأيمن على نقطة التوقف، واختر Edit Breakpoint، وأدخل تعبيرًا بلغة Swift أو Objective-C في حقل Condition. يُسمح بالمقارنات والعوامل المنطقية واستدعاءات الطرق دون آثار جانبية. Xcode يقيم التعبير في سياق البرنامج المتوقف، وإذا كان صحيحًا، يلتقط المصحح الحالة.

swift
for index in 0..<1000 {
    // Breakpoint with condition: index == 500
    // The debugger will stop only on the 501st iteration
    processItem(at: index)
}

الإجراءات عند التفعيل

بالإضافة إلى الشرط، يمكن لنقطة التوقف تنفيذ إجراءات تلقائية دون إيقاف البرنامج. يتم ذلك من خلال خيار Automatically continue after evaluating في إعدادات نقطة التوقف. تشمل الإجراءات: عرض القيم في الكونسول (po variable)، تشغيل إشارة صوتية، تنفيذ أمر LLDB عشوائي، أو تشغيل script شل. هذا النهج يستبدل تعبيرات print المؤقتة ويسمح بتسجيل البيانات دون تعديل الكود المصدري.

swift
// Breakpoint with action: po «Index: \(index), value: \(items[index])»
// Automatically continue = true → program does not stop

func processItems(_ items: [String]) {
    for (index, item) in items.enumerated() {
        // Here the breakpoint logs every iteration without stopping
        print("Processing \(item)")
    }
}

هذه التقنية مفيدة بشكل خاص عند تصحيح تحديثات UI — على سبيل المثال، لتسجيل جميع تغييرات الإطارات دون التدخل في كود المتحكم. وفقًا لـ Ray Wenderlich، استخدام إجراءات نقاط التوقف بدلاً من تعبيرات print المؤقتة يقلل وقت التصحيح بنسبة 30–40% بسبب عدم الحاجة لتنظيف الكود بعد الانتهاء.

إدارة نقاط التوقف عبر LLDB

بينما يوفر Xcode واجهة رسومية مريحة، LLDB يدعم عشرات الأوامر للإدارة البرمجية لنقاط التوقف مباشرة من كونسول المصحح. هذا يوفر إمكانيات غير متاحة عبر GUI: تعطيل جماعي لنقاط التوقف بتعبير منتظم، تعيين نقاط توقف في المكتبات المحملة ديناميكيًا، وإنشاء مشغلات معقدة متعددة الخطوات.

أوامر LLDB الأساسية لنقاط التوقف

أمر LLDBالوصفمثال
breakpoint setتعيين نقطة توقفbreakpoint set -f ViewController.swift -l 42
breakpoint listعرض جميع نقاط التوقفbreakpoint list
breakpoint disableتعطيل نقطة توقف حسب الرقمbreakpoint disable 1
breakpoint deleteحذف نقطة توقفbreakpoint delete 1.2
breakpoint modifyتعديل الشرط أو الإجراءbreakpoint modify -c «i > 100» 1
lldb
(lldb) breakpoint set -f LoginViewController.swift -l 15 -c "email.isEmpty"
Breakpoint 1: 15 locations added.
(lldb) breakpoint modify 1 -C "po email" -G true
(lldb) breakpoint list
1: name = 'LoginViewController.swift:15', condition = 'email.isEmpty'
    1.1: addr = 0x1000a3b40

التعبيرات المنتظمة في breakpoint set

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

lldb
(lldb) breakpoint set -r "handle[A-Z]" -s DataManager
Breakpoint 2: 6 locations.
(lldb) breakpoint set -r ".*Error.*"
Breakpoint 3: 23 locations.

نقاط التوقف الرمزية ونقاط توقف الاستثناء

Exception breakpoint يوقف تنفيذ البرنامج عند إلقاء أي استثناء — سواء أخطاء Objective-C أو Swift. في Xcode، يمكن تكوين اعتراض استثناءات Objective-C فقط، أو أخطاء Swift فقط، أو جميع الأنواع. هذه أداة لا غنى عنها عندما يتعطل التطبيق دون إشارة واضحة إلى الموقع في الكود — على سبيل المثال، عند الوصول إلى كائن تم تحريره.

Swift Error Breakpoint

Swift Error Breakpoint هو نوع متخصص ظهر في Xcode 11. يعترض اللحظة التي ترمي فيها دالة Swift خطأ عبر throw، قبل أن تصل إلى كتلة catch. هذا يسمح برؤية أي دالة أنشأت الخطأ وبأي وسائط، وهو أمر بالغ الأهمية عند تصحيح سلاسل استدعاءات معقدة بمستويات متعددة من معالجة الأخطاء.

swift
enum NetworkError: Error {
    case invalidURL
    case noData
    case decodingFailed(String)
}

func loadUserProfile(id: Int) throws -> UserProfile {
    guard id > 0 else {
        throw NetworkError.invalidURL
    }
    // Swift Error Breakpoint will stop here on throw
    return UserProfile(id: id, name: "Test")
}

نقاط التوقف الرمزية فعالة أيضًا عند تصحيح KVO و NotificationCenter. بتعيين نقطة توقف على observeValue(forKeyPath:of:change:context:)، يمكن للمطور اعتراض جميع إشعارات KVO في التطبيق، مما يساعد في تشخيص تحديثات UI غير المتوقعة أو حالات السباق المتعلقة بمراقبة الخصائص.

نصائح عملية للعمل مع نقاط التوقف

الاستخدام الفعال لنقاط التوقف يتجاوز بكثير مجرد التوقف على سطر. المطورون ذوو الخبرة يجمعون بين أنواع نقاط التوقف مع scripts LLDB ومناطق التوقف المؤقتة وتصدير التكوينات للتصحيح القابل للتكرار. دعنا نلقي نظرة على أكثر التقنيات فائدة، المدعومة بممارسة مهندسي Apple و Google.

عزل الكود المشبوه

عند تصحيح الأخطاء الصعبة، استخدم مزيجًا من نقطة توقف عند مدخل الطريقة ونقطة مراقبة (watchpoint) على تغير متغير رئيسي. قم بتعيين نقطة توقف خطية قبل التعيين، ثم أنشئ watchpoint على المتغير عبر أمر LLDB watchpoint set variable. عندما تتغير القيمة، سيتوقف المصحح بغض النظر عن مكان حدوث التعديل في الكود. وفقًا لـ Google، هذا النهج يمكنه العثور على مصدر سباق البيانات في 90% من الحالات خلال جلسة تصحيح واحدة.

lldb
(lldb) watchpoint set variable self->_balance
Watchpoint 1: addr = 0x600000c4b80 size = 8
    state = enabled  type = w
    watchpoint spec: 'self._balance'
(lldb) watchpoint list
1: location = 0x600000c4b80, type = write, variable = '_balance'

مجموعات نقاط التوقف لسيناريوهات الاختبار

Xcode يسمح بتجميع نقاط التوقف عبر Breakpoint Navigator. أنشئ مجموعة منفصلة لكل سيناريو — على سبيل المثال، «تسجيل الدخول»، «شراء»، «أخطاء الشبكة». عند اختبار وظيفة محددة، فعّل المجموعة المقابلة فقط، مع تعطيل الباقي. هذا يمنع التنشيطات الخاطئة ويسرع التصحيح في المشاريع الكبيرة حيث يمكن أن يتجاوز عدد نقاط التوقف عدة عشرات. يتيح تصدير مجموعة إلى ملف مشاركة التكوين مع الزملاء عبر نظام التحكم في الإصدارات.

الأتمتة مع Scripts LLDB

للسيناريوهات المعقدة، LLDB يدعم تنفيذ scripts Python عند تفعيل نقطة التوقف. في إجراء نقطة التوقف، حدد script import my_debug_helper; my_debug_helper.log_state(). هذا يفتح إمكانيات لا حدود لها: جمع إحصاءات تلقائي، مقارنة الحالات بين الاستدعاءات، إنشاء تقارير تغطية التصحيح. وفقًا لـ Apple، يتم استخدام واجهة Python LLDB في Xcode Cloud للتحليل التلقائي للأعطال أثناء اختبارات CI.

الأسئلة الشائعة

هل تؤثر نقاط التوقف على سرعة عمل التطبيق؟

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

هل يمكن تعيين نقطة توقف في مكتبة طرف ثالث بدون كود مصدري؟

نعم، عبر Symbolic breakpoint باسم الطريقة أو الدالة. LLDB سيتوقف عند استدعاء الرمز، حتى لو كان الكود المصدري غير متاح. بالإضافة إلى ذلك، يمكن استخدام مفكك LLDB للتنقل خطوة بخطوة.

ما الفرق بين Step Over و Step Into؟

Step Over ينفذ السطر الحالي بالكامل (بما في ذلك استدعاءات الدوال) ويتوقف عند السطر التالي. Step Into يدخل داخل الدالة المستدعاة، مما يسمح بتصحيحها خطوة بخطوة. Step Out يعيد التحكم إلى المتصل.

كيفية حفظ نقاط التوقف بين جلسات Xcode؟

يتم حفظ نقاط التوقف تلقائيًا في xcuserdata داخل المشروع. للمشاركة مع الزملاء، استخدم التصدير عبر Breakpoint Navigator → Share. يمكن إضافة ملف .xcbkptlist إلى المستودع إذا كان التصحيح جماعيًا.

ماذا تفعل إذا كانت نقطة التوقف لا توقف البرنامج؟

تحقق من تهيئة Debug للبناء، ونشاط نقطة التوقف (الأيقونة الزرقاء)، وصحة الرمز لنقاط التوقف الرمزية، وتطابق الكود المصدري مع الملف التنفيذي — غالبًا ما يساعد Clean Build Folder.

الملخص

  • Breakpoint — أداة التصحيح الرئيسية، توقف تنفيذ البرنامج عند سطر محدد لتحليل الحالة.
  • Xcode يدعم 5 أنواع من نقاط التوقف: خطية، شرطية، رمزية، استثناء، و Swift Error.
  • نقاط التوقف الشرطية تعمل فقط عند استيفاء تعبير محدد — مثالية للحلقات والمصفوفات.
  • LLDB يوفر عشرات الأوامر للإدارة البرمجية لنقاط التوقف، بما في ذلك التعطيل الجماعي والتعبيرات المنتظمة.
  • نقاط توقف الاستثناء و Swift Error تلتقط الأخطاء قبل وصولها إلى كتلة catch، مما يبسط تشخيص الأعطال.
  • إجراءات نقطة التوقف (التسجيل، الصوت، scripts) تستبدل تعبيرات print المؤقتة دون تعديل الكود المصدري.
  • Watchpoint مع نقطة توقف يسمح بتتبع تغييرات المتغيرات من أي نقطة في البرنامج.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا