iOS

[iOS] Debugging, Breakpoint

yujaehui 2024. 8. 26. 13:09

실행 중인 앱을 일시 정지하려면 브레이크포인트!

소스 코드에서 버그가 의심되는 위치를 찾았다면, 해당 줄에 브레이크포인트를 설정하여 디버거가 일시 정지하도록 만들 수 있습니다.

버그의 정확한 위치를 모르는 경우에는 심볼릭 브레이크포인트, 이슈 브레이크포인트로 특정 조건에서 중단되도록 설정할 수 있습니다.

또한, 반복 작업 중 발생하는 버그나 특정 조건에서만 발생하는 문제를 추적하려면 브레이크포인트에 조건을 지정할 수 있습니다.


브레이크포인트 위치 지정하기

코드에서 앱 실행을 일시 정지할 위치로 이동한 뒤, 소스 편집기의 행 번호 또는 여백을 클릭하여 브레이크포인트를 설정합니다.
그러면 해당 줄에 브레이크포인트 아이콘이 표시됩니다.

브레이크포인트를 끌어서 위아래로 이동하거나 여백 바깥으로 끌어내면 삭제할 수 있습니다.
디버그 영역 툴바의 브레이크포인트 아이콘을 클릭하면 전체 브레이크포인트를 활성화/비활성화할 수 있습니다.


전체 브레이크포인트 관리하기

여러 파일에 걸쳐 많은 브레이크포인트를 설정했다면, 좌측 내비게이터의 Breakpoint Navigator 버튼을 클릭해 관리할 수 있습니다.

  • 항목을 클릭하면 해당 위치로 이동할 수 있습니다.
  • 항목 선택 후 Delete 키를 누르면 삭제됩니다.
  • 아이콘을 클릭하면 활성화/비활성화 전환됩니다.
  • Control+클릭 → Edit Breakpoint에서 이름을 지정하면 자주 사용하는 브레이크포인트를 필터로 쉽게 찾을 수 있습니다.

필터 기능으로는 수정된 브레이크포인트만 보기, 활성화된 브레이크포인트만 보기 등의 조건도 설정할 수 있습니다.


조건을 지정하여 일시 정지하기

여러 번 반복 후 발생하는 버그라면, 매번 브레이크포인트에서 일시 정지 후 계속(Continue)을 누르는 것은 번거롭습니다.
이럴 땐 다음 두 가지 방법을 사용할 수 있습니다.

  • 지정 횟수만큼 무시 후 일시 정지 
    • Control+클릭 → Edit Breakpoint → Ignore 횟수 지정
    • 예: “8번 무시 후 중단”

  • 특정 조건일 때만 중단
    • Control-클릭 → Edit Breakpoint → 조건식 입력
    • 예: indexPath.row > 8

조건은 로컬 범위 내 사용 가능한 변수로 지정할 수 있으며, 참일 때만 중단됩니다.


코드 외부의 심볼에서 중단하기 (Symbolic Breakpoint)

직접 작성하지 않은 코드에서 문제가 발생할 경우, 예를 들어 Auto Layout 제약 오류 등에서는 UIViewAlertForUnsatisfiableConstraints 같은 심볼에 브레이크포인트를 설정해야 합니다.

  1. Breakpoint Navigator → + 버튼 → Symbolic Breakpoint 선택
  2. Symbol 필드에 UIViewAlertForUnsatisfiableConstraints 입력

이 경우 앱 메인 함수 등에서 일시 정지될 수 있으며, 콘솔에서 다음 명령어로 Auto Layout 추적 정보를 확인할 수 있습니다.

일부 심볼은 너무 자주 호출되어 디버깅이 어려워질 수 있으므로 조건을 설정하거나 원하는 시점에 활성화하는 방식으로 조절하세요.


처리되지 않은 Swift 오류 또는 Objective-C 예외에서 중단하기

Swift에서 처리되지 않은 오류 또는 Objective-C 예외가 발생하면 앱은 충돌합니다.
이때 스택 트레이스만으로 원인을 알기 어려운 경우가 많습니다.

Swift 오류의 경우

  • 보통 try! 구문에서 충돌하지만, 실제 오류 발생 위치는 다릅니다.
  • Breakpoint Navigator → + 버튼 → Swift Error Breakpoint 추가
  • 그러면 오류가 발생한 줄에서 중단됩니다.

Objective-C 예외의 경우

  • 주로 AppDelegate 또는 main에서 충돌 위치로 표시됩니다.
  • Breakpoint Navigator → + 버튼 → Exception Breakpoint 추가
  • 그러면 예외가 발생한 코드 줄에서 멈춥니다.

시스템에서 감지한 런타임 이슈에서 자동으로 중단하기

Xcode의 Sanitizer 도구를 사용하면 다음과 같은 런타임 문제를 감지할 수 있습니다.

  • 메인 스레드 외에서 UI 업데이트
  • 스레드 간 변수 접근 문제
  • 메모리 접근 오류
  • 정의되지 않은 동작
  1. Breakpoint Navigator → + 버튼 → Runtime Issue Breakpoint 추가
  2. 원하는 문제 유형 선택

Sanitizer가 해당 문제 가능성이 있는 코드 줄에서 앱을 일시 정지시키고, 원인을 추적할 수 있도록 돕습니다.


 

참고: https://developer.apple.com/documentation/xcode/setting-breakpoints-to-pause-your-running-app

'iOS' 카테고리의 다른 글

[iOS] Debuggging, LLDB  (0) 2024.11.12
[iOS] App's life cycle  (0) 2024.08.20
[iOS] App SandBox  (0) 2024.08.20