Breakpoint — این چیست، انواع نقاط توقف و استفاده در دیباگ

نویسنده: IT Sectr منتشر شده: 2026-05-06 زمان مطالعه: 9 دقیقه

نقطه توقف (breakpoint) — نشانی ویژه در کد است که با رسیدن به آن، دیباگر اجرای برنامه را برای بازرسی وضعیت متوقف می‌کند. به گزارش Apple Debugging Guide، breakpoint‌ها به توسعه‌دهنده اجازه می‌دهند مقادیر متغیرها، پیشه فراخوانی‌ها را مشاهده کرده و بدون تغییر کد مبدا، اجرای گام‌به‌گام انجام دهند. این ابزار اصلی برای تشخیص خطاها و تحلیل رفتار برنامه در زمان واقعی است.

نکات کلیدی

  • Breakpoint — نشانی در کد مبدا که اجرای برنامه را در نقطه مشخصی برای تحلیل وضعیت متوقف می‌کند.
  • انواع نقاط توقف شامل خطی، شرطی، سمبلیک و استثنا هستند — هر یک با حوزه کاربردی خود.
  • LLDB — دیباگر Xcode که breakpoint‌ها را از طریق رابط گرافیکی و دستورات کنسول مدیریت می‌کند.
  • Breakpoint‌های شرطی تنها در صورت تحقق عبارت منطقی مشخص فعال می‌شوند و در دیباگ حلقه‌ها صرفه جویی می‌کنند.
  • عملکرد برنامه تحت تأثیر قرار نمی‌گیرد اگر breakpoint‌ها فعال نباشند — آن‌ها به صورت شرطی کامپایل می‌شوند.

Breakpoint چیست و چه لزومی دارد

Breakpoint — نشانی فعالی است که در خط مشخصی از کد مبدا قرار می‌گیرد و با رسیدن به آن، دیباگر جریان اجرا را به صورت اجباری متوقف می‌کند. در این لحظه، توسعه‌دهنده کنترل کامل بر وضعیت برنامه به دست می‌آورد: می‌تواند مقادیر تمام متغیرها در حوزه دید فعلی را مشاهده کرده، پیشه فراخوانی‌ها را بررسی کند، عبارات دلخواهی را اجرا نماید و اجرا را گام‌به‌گام ادامه دهد. بدون breakpoint‌ها، دیباگ به اضافه کردن بی‌نهایت عبارات موقت print و حذف آن‌ها تبدیل می‌شد — روشی که کد را آلوده کرده و کنترل تعاملی ارائه نمی‌دهد.

هدف اصلی breakpoint مکان‌یابی منبع خطا است. وقتی برنامه به طور غیرمنتظره عمل می‌کند، توسعه‌دهنده قبل از بخش مشکوک یک نقطه توقف قرار می‌دهد و به طور متوالی تحلیل می‌کند که چه داده‌هایی وارد می‌شوند، متغیرها چگونه تغییر می‌کنند و اجرا از چه مسیری طی می‌شود. به گزارش Apple، بیش از 70% خطاها در برنامه‌های موبایل دقیقاً با استفاده از breakpoint‌ها همراه با اجرای گام‌به‌گام شناسایی می‌شوند، نه با تحلیل استاتیک کد.

Breakpoint‌ها بر عملکرد نسخه release تأثیری ندارند — آن‌ها تنها در پیکربندی Debug کامپایل می‌شوند. در Xcode یک علم ویژه DEBUG وجود دارد که کد دیباگ را با دستورات پیشپردازشی احاطه می‌کند. این تضمین می‌کند که نقاط توقف وارد App Store نشده و کار کاربران نهایی را کند نمی‌کنند.

مکانیزم توقف چگونه کار می‌کند

وقتی پردازنده به خطی می‌رسد که با breakpoint علامت‌گذاری شده، یک وقفه سخت‌افزاری یا نرم‌افزاری رخ می‌دهد. در Xcode از مکانیزم SIGTRAP استفاده می‌شود — سیگنال ردیابی که توسط دیباگر گیرندازی می‌شود. LLDB تمام جریان‌ها را متوقف کرده، کنترل را به رابط Xcode انتقال می‌دهد و منتظر دستور توسعه‌دهنده می‌ماند: ادامه (continue)، انتقال (step over)، ورود (step into) و یا خروج (step out).

swift
func fetchUserData(userId: Int) {
    // LLDB در اینجا اگر breakpoint قرار داده شده باشد متوقف می‌شود
    let url = URL(string: "https://api.example.com/user/\(userId)")
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    print("Fetching user \(userId)")
}

در مثال فوق، breakpoint قرار داده شده در خط let url = ... امکان بررسی این را فراهم می‌کند که کدام userId به تابع ارسال شده، آیا URL به درستی ساخته شده و چه سربرگ‌هایی در درخواست تنظیم شده‌اند، قبل از اجرای درخواست شبکه.

انواع نقاط توقف در Xcode

Xcode پنج نوع اصلی breakpoint ارائه می‌دهد که هر یک مسئله دیباگ مشخصی را حل می‌کند. درک تفاوت‌های آن‌ها به شما امکان انتخاب ابزار مناسب برای هر وضعیت را می‌دهد و زمان تشخیص را در مقایسه با استفاده تنها از نقاط توقف خطی دو تا سه برابر کاهش می‌دهد.

نوع 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 از breakpoint‌های خطی به عنوان ابزار اصلی دیباگ استفاده می‌کنند و سایر انواع را برای سناریوهای ویژه — مانند دیباگ کتابخانه‌های شخص ثالث یا گیرندازی استثنات — استفاده می‌کنند.

Symbolic breakpoint — گیرندازی فراخوانی توابع

Symbolic breakpoint به شما امکان می‌دهد در لحظه فراخوانی روش یا تابع مشخصی توقف کنید، حتی اگر به کد مبدای آن روش دسترسی نداشته باشید. این در دیباگ فریمورک‌های سیستمی ضروری است — برای مثال، برای گیرندازی لحظه‌ای که UIKit روش layoutSubviews را فرا می‌خواند. تنظیمات شامل نام سمبل (مثلاً برای Objective-C که -[UIView layoutSubviews] و برای Swift که UIView.layoutSubviews()) و پارامترهای اختیاری مانند: ماژول، شرط و تعداد عدول‌گذری.

swift
// Symbolic breakpoint برای گیرندازی layoutSubviews در UITableView
// نام سمبل: -[UITableView layoutSubviews]
// عمل: po UITableView.appearance()

class CustomTableView: UITableView {
    override func layoutSubviews() {
        super.layoutSubviews()
        // Symbolic breakpoint در اینجا فراخوانی را گیرندازی می‌کند
        print("layoutSubviews called")
    }
}

Breakpoint‌های شرطی و تنظیم عملیات

Breakpoint شرطی هر بار که به خط می‌رسد فعال نمی‌شود، بلکه تنها وقتی عبارت منطقی مشخص مقدار true بگیرد. این یک صرفه جویی عظیم زمان در دیباگ حلقه‌ها، پردازش آرایه‌ها و فراخوانی‌های بازگشتی است — به جای اینکه هر دفعه به صورت دستی روی Continue کلیک کنید، توسعه‌دهنده شرطی تعیین می‌کند و دیباگر تنها در لحظه مورد نیاز متوقف می‌شود.

تنظیم شرط توقف

برای افزودن شرط، روی breakpoint کلیک راست کرده، Edit Breakpoint را انتخاب کرده و در فیلد Condition یک عبارت Swift یا Objective-C وارد کنید. مقایسه‌ها، عوامل منطقی و فراخوانی روش‌هایی که عوارض جانبی ندارند مجاز هستند. Xcode عبارت را در زمینه برنامه متوقف محاسبه می‌کند و اگر درست باشد، دیباگر وضعیت را ثبت می‌کند.

swift
for index in 0..<1000 {
    // Breakpoint با شرط: index == 500
    // دیباگر تنها در 501امین تکرار متوقف می‌شود
    processItem(at: index)
}

عملیات هنگام فعال‌شدن

علاوه بر شرط، breakpoint می‌تواند عملیات خودکار را بدون توقف برنامه انجام دهد. این از طریق گزینه Automatically continue after evaluating در تنظیمات breakpoint انجام می‌شود. عملیات شامل می‌شود: نمایش مقدار در کنسول (po variable)، پخش سیگنال صوتی، اجرای یک دستور LLDB دلخواه یا اجرای یک اسکریپت شل. این روش جایگزین عبارات موقت print شده و امکان گذارش داده‌ها را بدون تغییر کد مبدا فراهم می‌کند.

swift
// Breakpoint با عمل: po "Index: \(index), value: \(items[index])"
// Automatically continue = true → برنامه متوقف نمی‌شود

func processItems(_ items: [String]) {
    for (index, item) in items.enumerated() {
        // در اینجا breakpoint هر تکرار را بدون توقف گذارش می‌کند
        print("Processing \(item)")
    }
}

این تکنیک به ویژه در دیباگ به‌روزرسانی‌های UI مفید است — مثلاً، برای گذارش تمام تغییرات فریم بدون دخالت در کد کنترلر. به گزارش Ray Wenderlich، استفاده از عملیات breakpoint به جای عبارات موقت print زمان دیباگ را 30–40% کاهش می‌دهد زیرا نیازی به پاک‌سازی کد پس از اتمام نیست.

مدیریت breakpoint‌ها از طریق LLDB

هرچند Xcode رابط گرافیکی راحتی ارائه می‌دهد، LLDB از ده‌ها دستور برای مدیریت برنامه‌ای نقاط توقف مستقیماً از کنسول دیباگر پشتیبانی می‌کند. این امکاناتی را فراهم می‌کند که از طریق GUI در دسترس نیستند: غیرفعال‌سازی انبوه breakpoint‌ها با عبارت منظم، قرار دادن نقاط توقف در کتابخانه‌های بارگیری شده پویا و ایجاد تریگرهای چند مرحله‌ای پیچیده.

دستورات اصلی LLDB برای breakpoint‌ها

دستور LLDBتوضیحمثال
breakpoint setتنظیم breakpointbreakpoint set -f ViewController.swift -l 42
breakpoint listنمایش تمام breakpoint‌هاbreakpoint list
breakpoint disableغیرفعال کردن breakpoint بر اساس شمارهbreakpoint disable 1
breakpoint deleteحذف breakpointbreakpoint 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 از قرار دادن breakpoint‌ها بر اساس عبارت منظم برای نامهای توابع پشتیبانی می‌کند. این به شما امکان می‌دهد تمام روش‌هایی را که با الگو مطابقت دارند گیرندازی کنید — مثلاً، تمام روش‌هایی که در یک کلاس مشخص با handle شروع می‌شوند. این روش در بازنویسی و تحلیل کد ناشناخته برای فهمیدن اینکه کدام روش‌ها در پردازش یک رویداد مشخص شرکت دارند استفاده می‌شود.

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

Breakpoint‌های سمبلیک و نقاط توقف بر استثنا

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 در زمان throw در اینجا متوقف می‌شود
    return UserProfile(id: id, name: "Test")
}

Breakpoint‌های سمبلیک در دیباگ KVO و NotificationCenter نیز موثر هستند. با قرار دادن breakpoint بر روی observeValue(forKeyPath:of:change:context:)، توسعه‌دهنده می‌تواند تمام اعلام‌های KVO در برنامه را گیرندازی کند که به تشخیص به‌روزرسانی‌های غیرمنتظره UI یة race condition‌های مرتبط با مشاهده ویژگی‌ها کمک می‌کند.

تکنیک‌های عملی کار با نقاط توقف

استفاده مؤثر از breakpoint‌ها خیلی فراتر از توقف ساده در یک خط است. توسعه‌دهندگان باتجربه انواع نقاط توقف را با اسکریپت‌های LLDB، مناطق توقف موقت و خروجی پیکربندی‌ها برای دیباگ تکرارپذیر ترکیب می‌کنند. بیایید مفیدترین تکنیک‌هایی را که توسط مهندسان Apple و Google تأیید شده‌اند بررسی کنیم.

جداسازی کد مشکوک

در دیباگ خطاهای به‌سختی قابل یافتن، از ترکیب breakpoint در ورودی متد و watchpoint در تغییر متغیر کلیدی استفاده کنید. قبل از تعیین مقدار یک breakpoint خطی قرار دهید، سپس با دستور LLDB watchpoint set variable یک watchpoint بر روی متغیر ایجاد کنید. وقتی مقدار تغییر کند، دیباگر بدون توجه به اینکه تغییر از کجای کد انجام شده متوقف می‌شود. به گزارش Google، این روش منبع مسابقه داده (data race) را در 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'

گروه‌های breakpoint برای سناریوهای آزمایشی

Xcode اجازه می‌دهد breakpoint‌ها را از طریق Breakpoint Navigator در گروه‌ها جمع‌آوری کنید. برای هر سناریو یک گروه جداگانه ایجاد کنید — مثلاً «ورود»، «خرید»، «خطاهای شبکه». هنگام آزمایش کارکرد مشخص، تنها گروه مربوطه را فعال کرده و سایر را غیرفعال کنید. این از فعال‌سازی‌های نادرست جلوگیری کرده و دیباگ را در پروژه‌های بزرگ که تعداد نقاط توقف می‌تواند از چند ده تا تجاوز کند سرعت می‌بخشد. خروجی گروه به فایل امکان اشتراک پیکربندی با همکاران از طریق سیستم کنترل نسخه را فراهم می‌کند.

خودکارسازی با اسکریپت‌های LLDB

برای سناریوهای پیچیده، LLDB از اجرای اسکریپت‌های Python در لحظه فعال‌شدن breakpoint پشتیبانی می‌کند. در عملیات breakpoint مقدار زیر را قرار دهید: script import my_debug_helper; my_debug_helper.log_state(). این امکانات نامحدودی را باز می‌کند: جمع‌آوری خودکار آمار، مقایسه وضعیت‌ها بین فراخوانی‌ها، تولید گزارش‌های پوشش کد توسط دیباگ. به گزارش Apple، LLDB Python API در Xcode Cloud برای تحلیل خودکار کراش‌ها در طول آزمایش‌های CI استفاده می‌شود.

پرسش‌های متداول

آیا breakpoint‌ها بر سرعت عملکرد برنامه تأثیر می‌گذارند؟

غیرفعال breakpoint‌ها بر عملکرد تأثیری ندارند — آن‌ها تنها در پیکربندی Debug کامپایل می‌شوند. نقاط توقف فعال به دلیل مکانیزم وقفه سخت‌افزاری اجرا را کند می‌کنند، اما تنها در زمان دیباگ.

آیا می‌توان breakpoint را در کتابخانه شخص ثالث بدون کد مبدا قرار داد؟

بله، از طریق Symbolic breakpoint بر اساس نام روش یا تابع. LLDB هنگام فراخوانی سمبل متوقف خواهد شد، حتی اگر کد مبدا در دسترس نباشد. به صورت اضافه می‌توان از دیساسمبلر LLDB برای پیشرفت گام‌به‌گام استفاده کرد.

تفاوت Step Over و Step Into در چیست؟

Step Over خط فعلی را کاملاً اجرا می‌کند (شامل فراخوانی ها) و در خط بعدی می‌ایستد. Step Into وارد تابع فراخوانی شده می‌شود و امکان دیباگ گام‌به‌گام آن را فراهم می‌کند. Step Out کنترل را به فراخواننده برمی‌گرداند.

چگونه breakpoint‌ها را بین جلسات Xcode ذخیره کنیم؟

Breakpoint‌ها به طور خودکار در xcuserdata داخل پروژه ذخیره می‌شوند. برای انتقال به همکاران از خروجی از طریق Breakpoint Navigator → Share استفاده کنید. فایل .xcbkptlist را می‌توان به مخزن اضافه کرد اگر دیباگ گروهی است.

اگر breakpoint برنامه را متوقف نمی‌کند چه کار کنیم؟

پیکربندی Debug ساخت، فعال بودن breakpoint (نشان آبی)، درستی سمبل برای symbolic breakpoint و مطابقت کد مبدا با فایل بینایی اجرایی را بررسی کنید — غالباً Clean Build Folder مشکل را حل می‌کند.

نتیجه‌گیری

  • Breakpoint — ابزار اصلی دیباگ که اجرای برنامه را در خط مشخص برای تحلیل وضعیت متوقف می‌کند.
  • Xcode از 5 نوع نقطه توقف پشتیبانی می‌کند: خطی، شرطی، سمبلیک، استثنا و Swift Error.
  • شرطی breakpoint‌ها تنها در صورت تحقق عبارت مشخص فعال می‌شوند — ایدهال برای حلقه‌ها و آرایه‌ها.
  • LLDB ده‌ها دستور برای مدیریت برنامه‌ای breakpoint‌ها ارائه می‌دهد، از جمله غیرفعال‌سازی انبوهی و عبارات منظم.
  • Exception و Swift Error breakpoint‌ها خطاها را قبل از رسیدن به بلوک catch گیرندازی می‌کنند و تشخیص کراش را ساده می‌کنند.
  • عملیات breakpoint (گذارش، صدا، اسکریپت) جایگزین عبارات موقت print بدون تغییر کد مبدا می‌شوند.
  • Watchpoint همراه با breakpoint امکان رگگشت تغییر متغیر را از هر نقطه برنامه فراهم می‌کند.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید