특정 문자열 일치에 도달하면 디버거가 중단 될 수 있기를 바랍니다. 예를 들어 다음과 같은 내용이있을 수 있습니다.
Foo myObj = [self gimmeObj];
myObj
라는 속성이있을 수 있습니다 name
. 디버거가 할당에서 중지하기를 원합니다.
[myObj.name isEqualToString:@"Bar"];
이를 위해 Xcode에서 조건부 중단 점을 어떻게 설정할 수 있습니까?
특정 문자열 일치에 도달하면 디버거가 중단 될 수 있기를 바랍니다. 예를 들어 다음과 같은 내용이있을 수 있습니다.
Foo myObj = [self gimmeObj];
myObj
라는 속성이있을 수 있습니다 name
. 디버거가 할당에서 중지하기를 원합니다.
[myObj.name isEqualToString:@"Bar"];
이를 위해 Xcode에서 조건부 중단 점을 어떻게 설정할 수 있습니까?
답변:
중단 점을 정상적으로 설정하여 Xcode에서 조건부 중단 점을 설정 한 다음 Control- 클릭하고 중단 점 편집을 선택합니다 (실행-> 표시-> 중단 점 선택).
중단 점 항목에는 조건 열이 있습니다.
이제 조건에 대해 염두에 두어야 할 몇 가지 문제가 있습니다. 첫째, gdb는 도트 구문을 이해하지 못하므로 myObj.name 대신 [myObj name]을 사용해야합니다 (이름이 ivar이 아닌 경우).
다음으로, gdb의 대부분의 표현식과 마찬가지로 반환 결과 유형, 즉 "BOOL"을 알려야합니다. 따라서 다음과 같은 조건을 설정하십시오.
(BOOL)[[myObj name] isEqualToString:@"Bar"]
종종 다음과 같은 코드를 임시로 추가하여 코드에서이 작업을 수행하는 것이 실제로 더 쉽습니다.
if ( [myObj.name isEqualToString:@"Bar"] ) {
NSLog( @"here" );
}
NSLog에 중단 점을 설정합니다. 그러면 gdb가 구문 분석 할 수있는 것과 불가능한 것에 대해 걱정할 필요없이 조건이 임의로 복잡해질 수 있습니다.
다음은 XCode lldb 조건부 중단 점을 사용하는 방법입니다.
먼저 중단 점을 더블 클릭 (또는 우클릭 edit breakpoint
)하면 대화창이 팝업됩니다.
이 옵션의 의미는 다음과 같습니다.
다음은 요약입니다. 위의 이미지 예에서는 변수 buildingId
가 13 일 때 여기에서 중단 함을 의미합니다 . 무시 시간을 1에 추가 buildingId
하면 13과 같을 때 첫 번째를 무시 하고 조건이 두 번째로 충족되면 중단됩니다.
액션의 경우 액션 추가를 누르면 선택 목록이 표시됩니다. 일반적으로 내가하는 일은 Debugger Command
po
확인해야하는 변수를 인쇄 하기 위해를 사용하는 것이며, 작업을 사용하는 것보다 더 나은 방법이 있다고 생각합니다.
런타임에 조건을 변경하면 앱을 다시 컴파일하고 실행해야하는 것 같습니다.
setter를 사용하여 myObj.name을 변경하는 경우 -[MyObjClass setName:]
Debugger Console 또는 Xcode의 Run-> Manage Breakpoints-> Add Symbolic Breakpoint 메뉴에서 기호 중단 점을 추가 할 수 있습니다 . 그렇지 않은 경우 (왜 그렇지 않습니까? 지정된 이니셜 라이저 또는 dealloc을 제외하고는 인스턴스 변수를 직접 수정해서는 안 됨) gdb에서 감시 점을 설정할 수 있습니다 (디버거가 실행되면 Xcode에서 디버거 콘솔 사용). 이 페이지에서는 방법을 설명합니다. Xcode가 디버거 콘솔을 사용하지 않고 감시 점을 설정하기위한 UI를 노출한다고 생각하지 않습니다.
프레임 워크 (디버그 빌드)로 작업 할 때 탐색하기 어렵거나 개발중인 프레임 워크에서 공개적으로 노출되지 않는 특정 파일 / 위치에 중단 점을 배치해야하는 경우가 있습니다. 한 가지 옵션은 조건부 중단 점을 트리거하고 스텝 인 / 스텝 아웃을 더 쉽게 만드는 도우미 클래스를 작성하는 것입니다.
- (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