2009-09-03 7 views
3

유용한 정보를 출력하는 데 도움이되는 디버그 기능이나 메소드를 작성하고 싶습니다. 호출 될 때, 나는이 필요합니다메서드 또는 함수의 호출자를 찾는 방법은 무엇입니까?

  • (객체에 의해 호출하는 경우) 호출하는 객체의 메모리 주소
  • 호출자의 방법 서명 (또는 메소드의 이름), 또는 이름의 방법 또는 기능

이 매개 변수의 전체 무리를 거치지 않고이 정보를 얻을 수 있다는 것을 소유하는 기능

  • 클래스 이름은? 다음 모든 방법과 기능에 가고, 무슨 일이 일어나고 있는지에 대한 유용한 정보를 인쇄하는 데 도움이

    debug(); 
    

    :

    내가 좋아하는 무언가를 만들고 싶어.

  • 답변

    2
    1. 디버깅에 관심있는 방법에 symbolic breakpoint을 설정하십시오.
    2. 스택에서 다시 이동해야하는 경우 (메서드 호출의 출처를 보려면) Xcode 디버거를 사용하거나 자동화하려는 경우 backtrace n을 사용하여 스택에서 위로 이동하십시오. number 프레임 수
    3

    내 첫 번째 본능은 그 정보의 대부분이 스택 추적에서 사용 가능하므로 gdb과 중단 점을 사용하는 것이 좋습니다. 당신이 정말로 그것을 인쇄를 참조하려는 경우에는, 당신이 무슨 말을하는지 대략 수있는 방법이 있습니다에 대한

    전처리 함수/메소드 이름을 인쇄하기위한 __PRETTY_FUNCTION__ 매크로를 인식하고 목표 - C 잘 작동 행동 양식. 메서드 이름과 값을 self의 각 관심있는 메서드에서 인쇄하면 가난한 사람의 스택 추적이 거의 생성 된 것입니다.

    #define METHOD() printf("%s\t0x%x\n", __PRETTY_FUNCTION__, (unsigned int)self) 
    

    을 그런 다음 그 정보를 인쇄 할 때마다 그냥이 줄을 포함 :

    METHOD(); 
    

    를 원하는 모든 파일이 포함 헤더에서이 같은 #define 포함

    시도 출력은 다음과 같습니다.

    -[MyClass initWithFoo:bar:] 0x12345678 
    

    앞서 말했듯이 이러한 유형의 접근 방식은 방대한 양의 출력을 생성 할 수 있으며 gdb는 아마도 더 실용적인 옵션 일 것입니다.

    2

    내가 사용하는 칼 크래프트의 DebugLog

    1

    미안 해요 당신을 위해 전체 응답, 단지 몇 가지 관련 정보가 없습니다.

    NSThread는 비 기호화 된 백 트레이스 인 callStackReturnAddresses을 가져 오는 메소드를 정의합니다. 10.6에서는 두 번째 및 세 번째 요청 인 callStackSymbols을 만족하는 문자열을 제공합니다.

    호출 객체의 주소를 가져 오는 것은 흥미롭지 만 완전히 간단하지는 않습니다. 스택을 걸어서 수신자 객체가 인 경우 일반적으로이 저장되고 인 경우은 ARM에 저장된 일반적인 장소가 있습니다. 이를 위해 (또는 누군가) ARM의 호출 규칙을 이해해야합니다.이 규칙은 아마 ARM ABI (응용 프로그램 바이너리 인터페이스)에 문서화되어 있습니다. 나는 ARM을 모른다. 이것은 i386에서 가능하며, ppc에서는 가능하지 않습니다.

    +1

    물론 ARM은 Mac이 아닌 iPhone을 타겟팅하는 경우에만 적합합니다. –

    +0

    허. 전에 아이폰에 대해 언급 한 질문을 맹세 할 수있다. – Ken

    +0

    당신 말이 맞아요. Quinn Taylor가 디버깅, 프로그램 흐름 및 메소드로 대체하기 전에는 원래 iphone, uikit 및 cocoa-touch 태그가있었습니다. http://stackoverflow.com/revisions/1373991/list 혼란을 가져 주어서 죄송합니다. –

    0

    backtrace(3) API를 사용하면 어떤 방법이나 기능이 호출되었는지 확인할 수 있습니다. 호출 객체를 얻는 것은 호출 객체가있는 경우 훨씬 더 어렵습니다.

    +0

    나는 그것을 시도했지만 백 트레이스 (backtrace) (3)를 사용할 수없는 것 같습니다. –

    +1

    # # 을 (를) 포함 했습니까? – Wevah

    관련 문제