업데이트: 이 이전 Xcode 플러그인은 다른 앱에서 사용할 수 있도록 Swift 패키지로 재구성되었습니다. 클라이언트 응용 프로그램에서는 Xprobe
제품을 사용하고 서버 측에서는 XprobeUI
제품을 사용하세요.
XprobePlugin은 ivar 수준까지 자세히 또는 주요 개체의 그래프와 해당 개체가 연결되는 방식으로 응용 프로그램 내부의 개체에 대한 보기를 제공합니다. 이 디스플레이는 실시간으로 애니메이션이 가능하며 메시지가 전달되는 동안 빨간색 개체와 메시지가 흐르는 경로를 강조 표시합니다. 이는 시드 세트에서 참조하는 모든 개체, 참조하는 개체, 참조하는 개체 등을 찾기 위해 "스윕"을 수행하여 Xcode에 표시될 수 있는 라이브 개체 목록을 구축함으로써 자동으로 수행됩니다. :
시뮬레이터에서 메모리 스위퍼는 앱의 프로젝트 소스를 변경할 필요 없이 lldb를 사용하여 플러그인 내부 번들에서 로드됩니다. 플러그인을 사용하려면 이 프로젝트를 빌드하고 Xcode를 다시 시작하세요. 애플리케이션이 실행되면 "Product/Xprobe/Load" 메뉴 항목을 사용하여 앱 메모리 스윕의 초기 보기를 로드합니다. 플러그인 개발자라면 "Product/Xprobe/Xcode"를 사용하여 Xcode 애플리케이션 자체의 개체를 검사할 수 있습니다.
그런 다음 패턴을 사용하여 앱에 나열된 개체 또는 해당 메서드를 필터링할 수 있습니다. 패턴과 일치하는 객체가 없고 클래스 이름인 경우 표시됩니다. '+' 또는 '-' 접두사가 붙은 패턴은 애플리케이션에 연결된 모든 클래스에서 패턴과 일치하는 메서드를 검색합니다. 트레이스에 인수로 전달된 개체를 검사하기 위해 "0x" 접두사가 붙은 원시 포인터를 입력할 수 있습니다. "시드"로 시작하는 개체 "경로"를 입력할 수도 있습니다. 애플리케이션을 검색할 때 기록된 경로에서 객체로 돌아가는 길을 쉽게 찾을 수 있습니다.
주입forxcode 플러그인이 설치되어 있는 경우 Xprobe를 사용하면 런타임 시 개체 상태의 모든 측면을 기록하거나 수정할 수 있는 소스가 있는 선택된 인스턴스에 대해 Objective-C 또는 Swift를 평가할 수 있습니다.
이제 Xprobe.mm은 오류 발생 시 앱을 독립 실행형 HTML 파일로 스냅샷할 수 있습니다. 이는 스윕을 수행하고 나중에 분석하기 위해 오류가 발생한 당시의 앱 상태를 문서화할 수 있습니다. ReactNative 예제 프로젝트 "TickTackToe"에 대한 예제 스냅샷 파일은 여기에서 볼 수 있습니다.
스냅샷을 찍으려면 앱에 Xprobe.mm을 포함하고 다음 호출을 사용하세요.
[Xprobe snapshot: @" /path/to/snapshot.html.gz " seeds: @[app delegate, rootViewController]];
어려움이 있는 경우 추가 제외:(NSString *)pattern 인수를 사용하여 캡처하지 않도록 클래스 이름의 패턴을 변경할 수 있습니다. 이에 대한 기본값은 다음과 같습니다.
@" ^(?:UI|NS((Object|URL|Proxy)$|Text|Layout|Index|.*(Map|Data|Font))|Web|WAK|SwiftObject|XC|IDE|DVT|Xcode3|IB|VK) "
나머지 기능은 일련의 주요 항목으로 가장 쉽게 롤오프됩니다.
ivar 내용을 보려면 객체의 링크를 클릭하세요.
세부정보 보기를 닫으려면 링크를 다시 클릭하세요.
ivar를 보려면 슈퍼클래스 링크를 클릭하세요.
앱에서 해당 값을 새로 고치려면 ivar 이름을 클릭하세요.
ivar 값을 클릭하여 앱에서 해당 값을 편집하고 설정하세요.
클래스의 속성, 메서드 및 모든 프로토콜을 볼 수 있습니다.
메소드 목록을 검색할 수 있습니다(슈퍼클래스 메소드 찾기도 가능)
해당 인스턴스의 메소드에 대한 호출 로깅을 시작하려면 "추적" 링크를 사용하십시오.
개체에 대해 추적된 모든 메서드를 보려면 각 클래스에 대해 추적을 클릭합니다.
정규식을 사용하여 추적 출력을 필터링할 수 있습니다.
하위 뷰 링크는 뷰 아래에 하위 뷰 트리를 재귀적으로 표시합니다.
"렌더링" 링크는 객체가 뷰일 때 이미지를 캡처합니다.
형제 링크에는 개체의 클래스를 공유하는 발견된 모든 개체가 표시됩니다.
새 스윕을 강제 실행하려면 검색 필드에 Enter를 입력하여 개체 목록을 새로 고칩니다.
그래프 버튼을 누르면 가장 중요한 개체와 마지막 스윕에서 가져온 개체에 직접 연결된 "키트" 개체의 요약 보기가 열립니다.
객체가 뷰인 경우 객체는 사각형으로 표시됩니다("하위 뷰"에 응답).
그래프를 표시하려면 컴퓨터에 "Graphviz/dot"을 설치해야 합니다.
위에서 설명한 대로 개체의 현재 내용을 보려면 개체를 클릭하세요.
포함할 개체에 대해 다양한 필터링을 적용할 수 있습니다.
"메시지 애니메이션"은 메시지를 보낼 때 개체가 "빨간색"으로 표시되도록 개체에 추적을 적용합니다.
그래프는 인쇄를 위해 Graphviz 또는 .png 형식으로 내보낼 수 있습니다.
아쉽게도 ivar_getTypeEncoding()이 ivar 필드에 대해 NULL을 반환하여 "sweep"에 참여하지 못하게 하므로 Swift 지원은 현재 제한되어 있습니다.
Xprobe는 로드될 때 Xcode에 연결되는 시뮬레이터에 번들을 로드하는 방식으로 작동합니다. 응용 프로그램은 다음 범주를 구현하여 Xprobe에 알려진 시드 노드 목록을 만듭니다.
@implementation Xprobe (Seeding)
+ ( NSArray *)xprobeSeeds {
UIApplication *app = [UIApplication sharedApplication ];
NSMutableArray *seeds = [ NSMutableArray arrayWithObject: app];
[seeds addObjectsFromArray: [app windows ]];
// support for cocos2d
Class ccDirectorClass = NSClassFromString ( @" CCDirector " );
CCDirector *ccDirector = [ccDirectorClass sharedDirector ];
if ( ccDirector )
[seeds addObject: ccDirector];
return seeds;
}
@end
또는 OSX의 경우:
+ ( NSArray *)xprobeSeeds {
NSApplication *app = [ NSApplication sharedApplication ];
NSMutableArray *seeds = [[app windows ] mutableCopy ];
if ( app. delegate )
[seeds insertObject: app.delegate atIndex: 0 ];
return seeds;
}
앱이 초기화되면 [Xprobe connectTo:"your.ip.address"retainObjects:YES]를 호출하여 Xcode 내에서 실행되는 TCP 서버에 연결합니다. keepObjects: 인수는 스윕에서 발견된 객체를 유지할지 여부를 지정합니다. 이렇게 하면 Xprobe의 안정성이 높아지지만 앱의 개체 수명 주기에 영향을 미칩니다. 그런 다음 [Xprobe 검색:@""]을 호출하여 루트 개체를 찾는 이러한 개체에서 시작하는 초기 검색을 수행합니다. "search:"가 호출되거나 객체 클래스 필터가 변경될 때마다 검색이 새로 수행됩니다. 애플리케이션은 Xprobe 및 Xtrace.{h,mm}를 사용하여 구축해야 합니다.
깨끗하고 "강한" 포인터와 "약한" 포인터가 존재하는 이 시대에는 객체가 어떻게든 시드에 표시되면 스윕이 매우 안정적으로 보입니다. 일부 레거시 클래스는 제대로 작동하지 않으며 할당 취소된 개체에 대한 포인터를 포함할 수 있는 "할당" 속성을 사용합니다. 이러한 클래스의 ivar를 스위핑하는 것을 피하기 위해 Xprobe에는 범주에서 재정의(경고 포함)할 수 있는 제외 필터가 있습니다.
static NSString *swiftPrefix = @" _TtC " ;
@implementation Xprobe (ExclusionOverride)
+ ( BOOL )xprobeExclude:( NSString *)className {
static NSRegularExpression *excluded;
if ( !excluded )
excluded = [ NSRegularExpression xsimpleRegexp: @" ^(_|NS|XC|IDE|DVT|Xcode3|IB|VK|WebHistory) " ];
return [excluded xmatches: className] && ![className hasPrefix: swiftPrefix];
}
@end
이러한 제외를 통해 Xprobe는 Xcode 자체 내에서 깔끔하게 작동할 수 있으며 이는 플러그인 개발자에게 유용합니다. 제안이나 피드백이 있으면 johnholdsworth.com의 xprobe 작성자에게 문의하세요. 주요 릴리스는 트위터 @Injection4Xcode를 통해 발표됩니다.
Swift 2.3+에서는 Xprobe가 더 이상 속성이 없는 ivar, 즉 NSObject에서 상속되지 않는 클래스를 검색할 수 없습니다.
Xprobe.{h,mm} - 스냅샷에 필요한 핵심 Xprobe 기능 IvarAccess.h - 이름으로 ivar 클래스에 액세스하는 데 필요한 루틴 Xprobe+Service.mm - Xcode에 연결하는 선택적 대화형 서비스
저작권 (c) 2014-5 John Holdsworth. Objectice-C 애플리케이션 개발 중 다운로드, 수정 및 사용이 허가된 재배포는 이 저작권 고지를 포함하여 공개 저장소 github을 통해서만 가능합니다. 앱을 통한 바이너리 재배포를 원하시면 연락주세요!
이 릴리스에는 MIT 라이센스가 적용되는 HTML 캔버스에서 "점" 파일을 렌더링하기 위해 우수한 canviz 라이브러리의 아주 약간 수정된 버전이 포함되어 있습니다. 변경 사항은 노드의 ID를 노드 레이블 태그로 전달하고(라인 212), 노드와 노드를 연결하는 라인의 렌더링을 반전하고(라인 406), 색상이 지정될 수 있도록 가장자리 경로를 저장하는 것입니다(라인 66 및 라인 66). 303) "canviz-0.1/canviz.js"에 있습니다.
이제 MIT 라이센스에 따라 주입을 사용하여 코드를 평가할 수 있는 CodeMirror JavaScript 편집기도 포함되어 있습니다.
소프트웨어는 상품성, 특정 목적에의 적합성 및 비침해에 대한 보증을 포함하되 이에 국한되지 않고 명시적이든 묵시적이든 어떠한 종류의 보증 없이 "있는 그대로" 제공됩니다. 어떠한 경우에도 작성자나 저작권 보유자는 계약, 불법 행위 또는 기타 행위로 인해 소프트웨어나 사용 또는 기타 거래와 관련하여 발생하는 모든 청구, 손해 또는 기타 책임에 대해 책임을 지지 않습니다. 소프트웨어.