Breakpoint — 정의, 중단점의 종류 및 디버깅에서의 사용

저자: IT Sectr 게시일: 2026-05-06 읽는 시간: 9 분

중단점(breakpoint)은 코드의 특별한 표식으로, 도달하면 디버거가 상태 검사를 위해 프로그램 실행을 일시 중지합니다. Apple Debugging Guide에 따르면, breakpoint를 사용하면 개발자가 소스 코드를 수정하지 않고도 변수 값, 호출 스택을 보고 단계별 실행을 수행할 수 있습니다. 이것은 실시간으로 오류를 진단하고 애플리케이션 동작을 분석하는 주요 도구입니다.

주요 포인트

  • Breakpoint — 상태 분석을 위해 지정된 지점에서 프로그램 실행을 중지하는 소스 코드의 표식입니다.
  • 중단점의 유형에는 라인, 조건부, 기호 및 예외가 있으며 — 각각 고유한 적용 영역이 있습니다.
  • LLDB — 그래픽 인터페이스와 콘솔 명령을 통해 breakpoint를 관리하는 Xcode 디버거입니다.
  • 조건부 breakpoint는 지정된 논리 표현식이 참인 경우에만 작동하여 루프 디버깅 시 시간을 절약합니다.
  • Breakpoint가 비활성화된 경우 애플리케이션의 성능에 영향을 미치지 않습니다 — 조건부로 컴파일됩니다.

Breakpoint란 무엇이며 왜 필요한가

Breakpoint는 소스 코드의 특정 라인에 설정되는 활성 표식으로, 도달하면 디버거가 강제로 스레드 실행을 중지합니다. 이 순간 개발자는 애플리케이션 상태를 완전히 제어할 수 있습니다: 현재 범위의 모든 변수 값을 보고, 호출 스택을 검사하고, 임의의 표현식을 실행하고, 단계별 실행을 계속할 수 있습니다. Breakpoint가 없으면 디버깅은 임시 print 표현식을 끝없이 추가했다가 제거하는 것으로 축소됩니다 — 코드를 오염시키고 대화형 제어를 제공하지 않는 접근 방식입니다.

Breakpoint의 주요 목적은 오류의 근원을 찾는 것입니다. 애플리케이션이 예기치 않게 동작할 때, 개발자는 의심스러운 섹션 앞에 중단점을 배치하고 어떤 데이터가 입력되는지, 변수가 어떻게 변경되는지, 실행이 어떤 경로를 따르는지 순차적으로 분석합니다. Apple에 따르면, 모바일 앱 버그의 70% 이상이 정적 코드 분석이 아닌 breakpoint와 단계별 실행의 조합을 통해 정확히 식별됩니다.

Breakpoint는 릴리스 빌드의 성능에 영향을 미치지 않습니다 — Debug 구성에서만 컴파일됩니다. Xcode에는 디버그 코드를 전처리기 지시문으로 감싸는 특수 DEBUG 플래그가 있습니다. 이렇게 하면 breakpoint가 App Store에 포함되지 않고 최종 사용자를 느리게 하지 않습니다.

중지 메커니즘의 작동 방식

프로세서가 breakpoint로 표시된 라인에 도달하면 하드웨어 또는 소프트웨어 인터럽트가 발생합니다. 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 = ... 라인에 설정된 breakpoint를 통해 함수에 전달된 userId가 무엇인지, URL이 올바르게 조합되었는지, 네트워크 호출이 실행되기 전에 요청에 어떤 헤더가 설정되었는지 확인할 수 있습니다.

Xcode의 중단점 유형

Xcode는 각각 특정 디버깅 작업을 해결하는 다섯 가지 주요 breakpoint 유형을 제공합니다. 차이점을 이해하면 각 상황에 최적의 도구를 선택하고 라인 중단점만 사용하는 것에 비해 진단 시간을 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 통계에 따르면 iOS 개발자의 85% 이상이 라인 breakpoint를 주요 디버깅 도구로 사용하며, 다른 유형은 타사 라이브러리 디버깅 또는 예외 캡처와 같은 특정 시나리오에 사용됩니다.

Symbolic Breakpoint — 함수 호출 가로채기

Symbolic breakpoint를 사용하면 특정 메서드나 함수가 호출될 때 중지할 수 있으며, 해당 메서드의 소스 코드에 접근할 수 없는 경우에도 가능합니다. 시스템 프레임워크를 디버깅할 때 필수적입니다 — 예를 들어 UIKitlayoutSubviews를 호출하는 순간을 가로채는 경우. 구성에는 기호 이름(예: Objective-C의 경우 -[UIView layoutSubviews], Swift의 경우 UIView.layoutSubviews())과 선택적 매개변수(모듈, 조건, 무시 횟수)가 포함됩니다.

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")
    }
}

조건부 Breakpoint 및 작업 구성

조건부 breakpoint는 라인이 실행될 때마다가 아니라 지정된 논리 표현식이 true로 평가될 때만 작동합니다. 이는 루프, 배열 처리 및 재귀 호출 디버깅 시 엄청난 시간을 절약합니다 — 매번 수동으로 Continue를 클릭하는 대신 개발자가 조건을 설정하고 디버거는 관련 순간에만 중지됩니다.

중지 조건 설정

조건을 추가하려면 breakpoint를 우클릭하고 Edit Breakpoint를 선택한 다음 Condition 필드에 Swift 또는 Objective-C로 표현식을 입력합니다. 비교, 논리 연산자 및 부작용이 없는 메서드 호출이 허용됩니다. Xcode는 중지된 프로그램의 컨텍스트에서 표현식을 평가하고 참이면 디버거가 상태를 캡처합니다.

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

작동 시 작업

조건 외에도 breakpoint는 프로그램을 중지하지 않고 자동 작업을 수행할 수 있습니다. 이는 breakpoint 설정의 Automatically continue after evaluating 옵션을 통해 구현됩니다. 작업에는 다음이 포함됩니다: 콘솔에 값 출력(po variable), 소리 신호 재생, 임의 LLDB 명령 실행 또는 셸 스크립트 실행. 이 접근 방식은 임시 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 표현식 대신 breakpoint 작업을 사용하면 이후 코드를 정리할 필요가 없어 디버깅 시간이 30~40% 단축됩니다.

LLDB를 통한 Breakpoint 관리

Xcode가 편리한 그래픽 인터페이스를 제공하지만 LLDB는 디버거 콘솔에서 직접 중단점을 프로그래밍 방식으로 관리하기 위한 수십 개의 명령을 지원합니다. 이는 GUI를 통해 사용할 수 없는 기능을 제공합니다: 정규 표현식으로 breakpoint 일괄 비활성화, 동적으로 로드된 라이브러리에 중단점 설정, 복잡한 다단계 트리거 생성.

Breakpoint를 위한 필수 LLDB 명령

LLDB 명령설명
breakpoint setBreakpoint 설정breakpoint set -f ViewController.swift -l 42
breakpoint list모든 breakpoint 표시breakpoint list
breakpoint disable번호로 breakpoint 비활성화breakpoint disable 1
breakpoint deleteBreakpoint 삭제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는 함수 이름에 대한 정규 표현식으로 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 will stop here on throw
    return UserProfile(id: id, name: "Test")
}

기호 breakpoint는 KVONotificationCenter 디버깅 시에도 효과적입니다. observeValue(forKeyPath:of:change:context:)에 breakpoint를 설정하면 개발자가 애플리케이션의 모든 KVO 알림을 가로챌 수 있어 예기치 않은 UI 업데이트 또는 속성 관찰과 관련된 경합 조건을 진단하는 데 도움이 됩니다.

중단점 작업을 위한 실용적인 팁

Breakpoint의 효과적인 사용은 단순히 라인에서 중지하는 것을 훨씬 넘어섭니다. 숙련된 개발자는 breakpoint 유형을 LLDB 스크립트, 임시 중지 영역 및 재현 가능한 디버깅을 위한 구성 내보내기와 결합합니다. Apple 및 Google 엔지니어의 실제 사례가 뒷받침하는 가장 유용한 기술을 살펴보겠습니다.

의심스러운 코드 격리

잡기 어려운 버그를 디버깅할 때 메서드 진입점의 breakpoint와 주요 변수 변경의 watchpoint 조합을 사용하십시오. 할당 전에 라인 breakpoint를 설정한 다음 LLDB 명령 watchpoint set variable로 변수에 watchpoint를 만듭니다. 값이 변경되면 코드 내에서 수정이 발생한 위치에 관계없이 디버거가 중지됩니다. 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'

테스트 시나리오를 위한 Breakpoint 그룹

Xcode는 Breakpoint Navigator를 통해 breakpoint를 그룹화할 수 있습니다. 각 시나리오에 대해 별도의 그룹을 만드십시오 — 예를 들어 “로그인”, “구매”, “네트워크 오류”. 특정 기능을 테스트할 때 해당 그룹만 활성화하고 나머지는 비활성화합니다. 이는 잘못된 트리거를 방지하고 중단점 수가 수십 개를 초과할 수 있는 대규모 프로젝트에서 디버깅 속도를 높입니다. 그룹을 파일로 내보내면 버전 제어를 통해 동료와 구성을 공유할 수 있습니다.

LLDB 스크립트를 통한 자동화

복잡한 시나리오의 경우 LLDB는 breakpoint 작동 시 Python 스크립트 실행을 지원합니다. Breakpoint 작업에서 script import my_debug_helper; my_debug_helper.log_state()를 지정합니다. 이는 무한한 가능성을 열어줍니다: 자동 통계 수집, 호출 간 상태 비교, 디버그 커버리지 보고서 생성. Apple에 따르면 LLDB Python API는 CI 테스트 중 자동 충돌 분석을 위해 Xcode Cloud에서 사용됩니다.

자주 묻는 질문

Breakpoint가 애플리케이션 속도에 영향을 미치나요?

비활성 breakpoint는 성능에 영향을 미치지 않습니다 — Debug 구성에서만 컴파일됩니다. 활성 중단점은 하드웨어 인터럽트 메커니즘으로 인해 실행 속도를 늦추지만 디버깅 중에만 그렇습니다.

소스 코드 없이 타사 라이브러리에 breakpoint를 설정할 수 있나요?

네, 메서드 또는 함수 이름으로 Symbolic breakpoint를 통해 가능합니다. 소스 코드를 사용할 수 없어도 LLDB는 기호가 호출될 때 중지됩니다. 또한 단계별 탐색을 위해 LLDB 디스어셈블러를 사용할 수 있습니다.

Step Over와 Step Into의 차이점은 무엇인가요?

Step Over는 현재 라인 전체(함수 호출 포함)를 실행하고 다음 라인에서 중지됩니다. Step Into는 호출된 함수 내부로 들어가 단계별 디버깅을 가능하게 합니다. Step Out은 호출자에게 제어권을 반환합니다.

Xcode 세션 간에 breakpoint를 저장하는 방법은?

Breakpoint는 프로젝트 내 xcuserdata에 자동으로 저장됩니다. 동료와 공유하려면 Breakpoint Navigator → Share를 통해 내보내기를 사용하십시오. .xcbkptlist 파일은 팀 디버깅의 경우 저장소에 추가할 수 있습니다.

Breakpoint가 프로그램을 중지하지 않으면 어떻게 하나요?

빌드의 Debug 구성, breakpoint 활동(파란색 아이콘), 기호 breakpoint의 기호 정확성, 소스 코드가 실행 파일과 일치하는지 확인하십시오 — Clean Build Folder가 자주 도움이 됩니다.

요약

  • Breakpoint — 상태 분석을 위해 지정된 라인에서 프로그램 실행을 일시 중지하는 주요 디버깅 도구입니다.
  • Xcode는 5가지 중단점 유형을 지원합니다: 라인, 조건부, 기호, 예외, Swift Error.
  • 조건부 breakpoint는 지정된 표현식이 참일 때만 작동합니다 — 루프와 배열에 이상적입니다.
  • LLDB는 일괄 비활성화 및 정규 표현식을 포함한 breakpoint의 프로그래밍 방식 관리를 위한 수십 개의 명령을 제공합니다.
  • 예외 및 Swift Error breakpoint는 catch 블록에 도달하기 전에 오류를 포착하여 충돌 진단을 단순화합니다.
  • Breakpoint 작업(로깅, 사운드, 스크립트)은 소스 코드를 수정하지 않고 임시 print 표현식을 대체합니다.
  • Watchpoint는 breakpoint와 함께 프로그램의 모든 지점에서 변수 변경을 추적할 수 있습니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기