2013-05-08 4 views
2

편집 : SDK가 무엇인지 궁금해하는 사람들을 위해, Flurry의 중국 복제품, == >> Umeng.NSSetUncaughtExceptionHandler 제 3 자 SDK에 의해 도용

편집 2 : 다시 호출되는 내 있던 uncaughtExceptionHandler 것 그 이상 SDK에서 옵션을 취급 비활성화 충돌 로그가 실제로있다. 그러나 그 SDK가 처음부터 트릭을 어떻게 수행했는지에 대해서는 매우 관심이 많습니다.

일부 제 3 자 iOS 분석 SDK를 사용하고 있습니다. 이상한 발견 :

원래 (SDK를 추가하기 전에) UncaughtExceptionHandler이 내 appDelegate.m에있었습니다. 괜찮 았어. 실제 iDevice에서 테스트 할 때 예외가 발생하면 콘솔에 일부 로그를 출력했습니다.

//Worked like charm before I added that weird analytics SDK 
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 

그럼 내가 추가 한 다음, 갑자기 이상한 분석 SDK (내가 한 모든 내 프로젝트에 운영자와 lib 디렉토리를 삭제하고 아래에 언급 한 바와 같이, 내 appDelegate.m 한 줄을 추가했다) 내 uncaughtExceptionHandler가 호출되지 않습니다. 그것이 나오는 것에 따라

//To make sure my uncaughtExceptionHandler was not set a second time by that SDK, 
//I set and reset again, before and after I initialized that weird SDK 
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 
[WeirdAnalyticsSDK startWithAppkey:@"XXX_XXX_XXX_XXX"]; 
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 

는 상관없이 내가 뭘, 한 나는 예외가 발생하면 SDK가 내 AppDelegate에, 내 있던 uncaughtExceptionHandler에 바로 전화를받을하지 않습니다 초기화하지 않기 때문에.

누군가 나를 도와 줄 수 있습니까? 어떤 이상한 SDK가 내 uncaughtExceptionHandler에 무슨 짓을했는지?

+0

이 타사 SDK는 무엇입니까? 구현 세부 사항은이 질문에 대답하는 데 중요 할 것이므로 우리는 그 이름이 필요합니다 ... – trojanfoe

+0

@trojanfoe 내 편집 된 질문보기 –

+0

아마도 SDK가 생각보다 나중 NSSetUncaughtExceptionHandler()를 호출하고 있습니다. 'NSSetUncaughtExceptionHandler'에 중단 점을 설정하고 앱을 실행 한 다음 SDK가 다시 설정하는 위치를 찾을 수 있는지 확인하십시오. Xcode에서 중단 점 탐색기로 이동하여 아래쪽에있는 + 기호 절점 추가를 클릭하십시오. –

답변

0

이것은 WeirdAnalyticsSDK이 서버에 오류 보고서를 보내고 overridseuncaughtExceptionHandler을 전송했기 때문일 수 있습니다.

나는 hockeyapp SDK을 사용하는 동안 나에게 일어난다. 디버깅 모드에서 sdk의 init 라인을 무시하고 모든 것이 잘 동작했습니다.

WeirdAnalyticsSDKenable debug mode 플래그가 있는지 확인해야합니다.

+1

그 이유는 OP의 예외 처리기가 리셋 할 때 여전히 사용되지 않는 이유를 설명하지 못합니다. ** ** ** sdk가 초기화 된 후에였습니다. – trojanfoe

+0

네, 맞습니다.하지만 추적 데이터를 서버로 보낼 때 SDK가 처리기를 재설정 할 수 있습니다. 어쨌든 sdk 구현이나 sdk 실제 이름 없이는 여기에서 문제를 찾기가 어렵습니다. D – danypata

+0

@danypata 제 편집 된 답변보기. 내 질문의 시작 부분에 실명을 추가했습니다. –

-1

NSSetUncaughtExceptionHandler을 설정하고 예외가 발생하지 않았을 가능성은 없습니다.

아니요 NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);을 다시 작성해야합니다. AppDelegate.muncaughtExceptionHandler 방법이 정의되어 있는지 여부를 정확하게 확인하십시오. 코드 행 아래에 적절하게 입력하십시오.

void uncaughtExceptionHandler(NSException *exception){ 
//here further logic would go 
} 

나는 같은 타사 (Flurry) SDK을 구현하고, 이메일을 통해 개발자 지원에 충돌 로그를 보내는 uncaughtExceptionHandler을 추가했습니다. 모든 것은 매력과 함께했습니다.

uncaughtExceptionHandler 메서드의 정의 부분을 놓치거나 잘못 입력했다고 생각합니다.

그런 경우가 아니라면, 당신은 정확하고 적절한 해결책을 제공 할 수있는 더 많은 지원을 위해 flury 지원팀에 연락해야합니다. 지원 이메일 주소는 [email protected]입니다. 도움이되기를 바랍니다.

+0

제 질문을 신중하게 읽어주십시오. 나는 명시 적으로 일하는 데 사용되는 핸들러를 말했고, 큰 일을했다. (말하자면, 핸들러를 구현하는 방법을 알고 그것을 구현했다.) 게다가 Flurry가 사용자 정의 처리기를 방해하지 않는 이유는 Flurry의 ** setCrashReportingEnabled **가 기본적으로 OFF로 설정되어 있기 때문입니다. –

+0

@DiWu 나는 당신의 질문을 매우 신중하게 읽고 SDK의 그런 행동을보기 위해 놀랐습니다. 그리고 한가지는 당신에게 도움을주고 싶지 않을뿐입니다. 그리고 SDK에 대해 알고있는''flurry ' 버전 4.0.0 flurry'는'exceptionalHandler'를 설정하고'exceptionhandler' 메소드에서'logError' 메시지를 호출 할 때까지'crash log'를 서버에 자동으로 보낼 수 없습니다. 그리고 여전히'exceptionHandler' 이름을'임의의'이름으로 변경하기 만하면됩니다. – Kamarshad

+1

@DiWu doig하기 전에 한 가지 upVote 및 DownVote는 누군가가 제공 한 대답을보고 생각합니다. – Kamarshad

-1

이 문제가 발생했습니다.

NSSetUncaughtExceptionHandler을 호출하면 NSSetUncaughtExceptionHandler을 호출하면됩니다. 다음은 샘플 코드입니다.

static void myExceptionHandler(NSException *exception) { 

    /* do your logic of exception handler */ 

    // invoke WeirdAnalyticsSDK's exception handler if needed 
    [UIApplication sharedApplication].delegate.hijackedHandler(exception); 
} 

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    /* configure WeirdAnalyticsSDK which maybe call `NSSetUncaughtExceptionHandler` */ 

    // remember to claim property hijackedHandler in header file 
    self.hijackedHandler = NSGetUncaughtExceptionHandler(); 

    // make sure you call `NSSetUncaughtExceptionHandler` after any possible one call NSSetUncaughtExceptionHandler 
    NSSetUncaughtExceptionHandler(&myExceptionHandler); 
    return YES; 
} 
0

OK, 세 번째 SDK에서 사용한 핸들러를 연결해야합니다.

  • 우리는 세 번째 sdk에 msg를 보내서 세 번째 sdk의 ExceptionHandler를 등록해야합니다.
  • 우리는 세 번째 SDK가 사용한 처리기를 저장합니다. "NSGetUncaughtExceptionHandler"를 사용하여 핸들러를 가져옵니다.
  • "NSSetUncaughtExceptionHandler"로 예외를 처리합니다. 넷째, 우리는 UncaughtExceptionHandlerMaple fouction에서
  • "UncaughtExceptionHandlerMaple"는 foucntion을 사용하여 자신에 의해 excetion을 처리, 우리는에 의해 --- "_previousHandler (예외)"

```

세 번째 SDK 핸들러를 실행해야
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    //register the third sdk 
    // save the handler by the third SDK 
    _previousHandler = NSGetUncaughtExceptionHandler(); 
    // setting the handler for yourself 
    NSSetUncaughtExceptionHandler (&UncaughtExceptionHandlerMaple); 
} 

void UncaughtExceptionHandlerMaple(NSException *exception) { 
    //handle yourself logic for the exception 
    //code ... 
    //recover the third sdk's exception handle 
    _previousHandler(exception); 
} 

```

+1

답변에 대해 좀 더 구체적으로 설명해야합니다. – timiTao

+0

좋아요, 다시 편집했습니다. –