객체 문자열 속성을 기반으로 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.