객체 문자열 속성을 기반으로 Xcode에서 조건부 중단 점을 설정하는 방법은 무엇입니까?


93

특정 문자열 일치에 도달하면 디버거가 중단 될 수 있기를 바랍니다. 예를 들어 다음과 같은 내용이있을 수 있습니다.

Foo myObj = [self gimmeObj];

myObj라는 속성이있을 수 있습니다 name. 디버거가 할당에서 중지하기를 원합니다.

[myObj.name isEqualToString:@"Bar"];

이를 위해 Xcode에서 조건부 중단 점을 어떻게 설정할 수 있습니까?

답변:


184

중단 점을 정상적으로 설정하여 Xcode에서 조건부 중단 점을 설정 한 다음 Control- 클릭하고 중단 점 편집을 선택합니다 (실행-> 표시-> 중단 점 선택).

중단 점 항목에는 조건 열이 있습니다.

이제 조건에 대해 염두에 두어야 할 몇 가지 문제가 있습니다. 첫째, gdb는 도트 구문을 이해하지 못하므로 myObj.name 대신 [myObj name]을 사용해야합니다 (이름이 ivar이 아닌 경우).

다음으로, gdb의 대부분의 표현식과 마찬가지로 반환 결과 유형, 즉 "BOOL"을 알려야합니다. 따라서 다음과 같은 조건을 설정하십시오.

(BOOL)[[myObj name] isEqualToString:@"Bar"]

종종 다음과 같은 코드를 임시로 추가하여 코드에서이 작업을 수행하는 것이 실제로 더 쉽습니다.

if ( [myObj.name isEqualToString:@"Bar"] ) {
    NSLog( @"here" );
}

NSLog에 중단 점을 설정합니다. 그러면 gdb가 구문 분석 할 수있는 것과 불가능한 것에 대해 걱정할 필요없이 조건이 임의로 복잡해질 수 있습니다.


12
코드를 변경하면 로깅을 제거하거나 동작을 변경하는 것을 잊어 버릴 위험이 있다는 점을 제외하고
— Pål Brattberg

3
사실입니다. 나는 종종 문자열에 "NYI"(아직 구현되지 않음)를 추가하여이 문제를 완화 한 다음 NYI에 대한 시험판 검사 검색에서이를 포착합니다.
— Peter N Lewis

18
이 작업을 수행하려면 (bool) 대문자를 (BOOL), 아마도 LLDB로 만들어야했습니다.
— Wex 2012-07-09

1
bool은 GDB에서 나를 위해 작동하지 않았고 BOOL 또는 int를 사용해야했습니다. 차이점은 여기 stackoverflow.com/a/544250/725871에 설명되어 있습니다 .
— Chaosphere2112

2
드디어 등장한 200 개의 게임 버그가 한 번씩 발생하고 이제 조건부 중단 점을 수행해야하는 경우 코드에 넣을 수 없습니다. 코드를 변경하기 위해 프로그램을 중지하는 것은 선택 사항이 아닙니다.
— Almo 2013

21

다음은 XCode lldb 조건부 중단 점을 사용하는 방법입니다.

먼저 중단 점을 더블 클릭 (또는 우클릭 edit breakpoint)하면 대화창이 팝업됩니다.

여기에 이미지 설명 입력

이 옵션의 의미는 다음과 같습니다.

  1. 조건 : 중단 점은이 조건에서만 실행됩니다.
  2. 무시 : 중단 점을 실행하기 전에 조건이 충족되어야하는 횟수
  3. Action : 중단 점이 중단 된 후 실행되는 작업입니다.
  4. 옵션 : 작업 평가 후 자동으로 계속

다음은 요약입니다. 위의 이미지 예에서는 변수 buildingId가 13 일 때 여기에서 중단 함을 의미합니다 . 무시 시간을 1에 추가 buildingId하면 13과 같을 때 첫 번째를 무시 하고 조건이 두 번째로 충족되면 중단됩니다.

액션의 경우 액션 추가를 누르면 선택 목록이 표시됩니다. 일반적으로 내가하는 일은 Debugger Command po확인해야하는 변수를 인쇄 하기 위해를 사용하는 것이며, 작업을 사용하는 것보다 더 나은 방법이 있다고 생각합니다.

런타임에 조건을 변경하면 앱을 다시 컴파일하고 실행해야하는 것 같습니다.


아마도 질문이 문자열 값을 기반으로 중단 점에서 중지하는 것이었기 때문일 것입니다. [나는 투표자가 아니 었습니다]
— ZS

1
감사합니다. 이 답변은 더 많은 표를받을 가치가 있습니다.
— andreskwan

7

이것이 작동하는지 확실하지 않지만 해당 코드 줄에 중단 점을 설정하고 디버거 콘솔 (Cmd + Shift + R)을 열고 다음을 입력 할 수 있습니다.

condition N (int)[[myObj name] isEqualToString:@"Bar"]

여기서 N은 중단 점의 번호 (정수)로 대체됩니다.


2

setter를 사용하여 myObj.name을 변경하는 경우 -[MyObjClass setName:]Debugger Console 또는 Xcode의 Run-> Manage Breakpoints-> Add Symbolic Breakpoint 메뉴에서 기호 중단 점을 추가 할 수 있습니다 . 그렇지 않은 경우 (왜 그렇지 않습니까? 지정된 이니셜 라이저 또는 dealloc을 제외하고는 인스턴스 변수를 직접 수정해서는 안 됨) gdb에서 감시 점을 설정할 수 있습니다 (디버거가 실행되면 Xcode에서 디버거 콘솔 사용). 이 페이지에서는 방법을 설명합니다. Xcode가 디버거 콘솔을 사용하지 않고 감시 점을 설정하기위한 UI를 노출한다고 생각하지 않습니다.


0

프레임 워크 (디버그 빌드)로 작업 할 때 탐색하기 어렵거나 개발중인 프레임 워크에서 공개적으로 노출되지 않는 특정 파일 / 위치에 중단 점을 배치해야하는 경우가 있습니다. 한 가지 옵션은 조건부 중단 점을 트리거하고 스텝 인 / 스텝 아웃을 더 쉽게 만드는 도우미 클래스를 작성하는 것입니다.

- (void)invokeFrameworkMethod {
    ...
    [DebugConditionalBreakPointHelper breakPointCondition:YES comment:@"from invokeFrameworkMethod."];
    ...
}

개발중인 프레임 워크의 헤더 선언.

#import <Foundation/Foundation.h>

@interface DebugConditionalBreakPointHelper : NSObject
+ (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment;
@end

그리고 구현 파일 :

#import "DebugConditionalBreakPointHelper.h"

@implementation DebugConditionalBreakPointHelper
+ (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment {
    if (enabled)
    {
        NSLog(@"Triggerred Conditional Break Point. Comment: %@");
    }
}
@end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.