2011-09-21 6 views
0

세부 정보를 얻으려는 프레임 워크를 개발하려고합니다.빌드 직전에 클래스 파일에 코드 추가 - 목표 C

내 iPhone 응용 프로그램에 1000 개 이상의 메소드가있는 100 개 이상의 클래스가 있다고 가정합니다. 이 시나리오에서는 각 클래스의 각 메소드 (시작 또는 끝 또는 둘 다)에 NSLog를 추가하려고합니다.

수동으로 NSLog 추가가 가능하지만 더 좋은 해결책이 있습니까? 수동 작업을 수행 할 필요없이이 로그를 추가 할 수있는 방식으로 응용 프로그램을 구축하는 것과 같습니다.

감사와 안부,


데니스,

Your answer 많은 포럼에 걸쳐 가장 유용했다. 고마워요.

내가 이런 식으로 찾고있는 이유는 많은 고객 프로젝트가 있으며 많은 경우 QA 및 UAT 중에 충돌이나 기타 문제가 발생하기 때문입니다. ~ 80 %가 재현 할 수 없거나 특정 시나리오가 필요합니다. 우리는 .crash와 dsym을 사용하여 이러한 문제를 추적하고있었습니다. 그러나 그러한 시나리오에서는 그렇게 유용하지 않습니다.

내가 찾고있는 것은 사용자가 따라 다니는 단계를 기록하는 추가 빌드를 제공하여 그러한 문제를 쉽게 재현 할 수 있도록하는 것입니다.

현재 프리 컴파일 된 헤더와 언급 한 첫 번째 방법을 사용하고 있습니다. 첫 번째 여는 중괄호를 검색 한 다음 매크로로 바꿉니다.

내가 언급 한대로 DTrace와 objc_msgSend를 살펴볼 것입니다. 나는 당신이 어떤 선호하는 튜토리얼을 가지고 있다면 이것들 사이에서 google을 잘 할 것이다.

감사와 안부, : D는

+2

Xcode에서 내장 디버거를 사용하는 것이 좋습니다. –

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 콘솔에서 nslog 출력을보고 싶습니다. 어떻게 디버거가 많은 로그를 추가 할 수 있습니까? 나는 당신의 말이 이해가되지 않습니다. – Abhishek

답변

0

그래서 당신은 당신의 코드에 추적 기능을 추가 할?

Apple은 이와 같은 것을 제공하지 않습니다. 직접 추적 시설을 추가해야합니다. 소스 코드 스타일이 일관성이 있다면 자동으로 상대적으로 쉽습니다. 마이너스 (또는 더하기) 기호로 시작하는 줄에 이어 첫 번째 여는 중괄호를 찾는 것과 같습니다.

또는 공용 Objective-C 런타임 함수를 사용하여 모든 클래스와 모든 메소드를 열거 한 다음 NSLog이있는 클래스와 메소드를 각각 메소드 swizzle 한 다음 원본으로 점프합니다.

또는 objc_msgSend의 오픈 소스 구현을 취하고 처음에는 NSLog으로 전화를 걸 수 있습니다. obj_msgSend 꼬리가 메서드에 호출되므로 리턴시 호출을 추가 할 수 없습니다. 당연히 엄청난 결과물에 대비하십시오. NSLog에 대한 호출을 selector 매개 변수의 값으로 objc_msgSend (예 : 공통 접두사)으로 설정하고 싶을 수 있습니다.

마지막으로 추적하는 가장 좋은 방법은 DTrace 프로브를 objc_msgSend의 항목에 첨부하는 것입니다. 위에서 언급 한 것과 같은 꼬리 호출 이유 때문에 DTrace 프로브를 반환 할 수는 없습니다.

하지만 더 좋은 질문은 입니다. 이유는입니다.