2014-05-15 3 views
1

충돌 보고서 :이 충돌을 이해하는 방법?

0 ??? 0x0 + 0 
1 TestPrj -[AppListReader addInstalledApps:] (AppListReader.m:186) + 77516  
2 TestPrj -[AppListReader getAppsInstalled] (AppListReader.m:161) + 77320 
3 TestPrj -[DetectAppsInstalledService activate:] (DetectAppsInstalledService.m:48) + 197612 
4 TestPrj -[BusinessManager handleBG] (BusinessManager.m:762) + 116672  
5 TestPrj -[BusinessManager activate:] (BusinessManager.m:208) + 106236 
6 TestPrj -[AppDelegate launchViewController:] (AppDelegate.m:338) + 32564  
7 TestPrj -[AppDelegate application:didFinishLaunchingWithOptions:] (AppDelegate.m:153) + 27396 
8 UIKit <redacted> + 316  
9 UIKit <redacted> + 1564 
10 UIKit <redacted> + 772  
11 UIKit <redacted> + 3316 
12 UIKit <redacted> + 104  
13 UIKit <redacted> + 672  
14 GraphicsServices <redacted> + 676  
15 GraphicsServices <redacted> + 48 
16 CoreFoundation <redacted> + 56 
17 CoreFoundation <redacted> + 444  
18 CoreFoundation <redacted> + 1620 
19 CoreFoundation CFRunLoopRunSpecific + 452 
20 UIKit <redacted> + 784  
21 UIKit UIApplicationMain + 1156  
22 TestPrj main (main.m:21) + 23548  
23 libdyld.dylib <redacted> + 4 

라인 (186)은 다음과 같습니다

NSMutableArray *allObjetcsArr = [self getInstalled]; 

이 구현 : 충돌이 BugSense를 통해 수신되는

-(NSMutableArray *)getInstalled 
{ 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@"ApplicationType",@"Any", [self defaultReturnAttributes] ,@"ReturnAttributes",nil]; 

    MobileInstallationLookup = dlsym(RTLD_DEFAULT, "MobileInstallationLookup"); 
    NSDictionary *apps = (__bridge NSDictionary *)((__bridge void*)MobileInstallationLookup(options)); 

    NSMutableArray *allObjetcsArr = [[NSMutableArray alloc]initWithArray:[apps allValues]]; 

    return allObjetcsArr; 
} 

와 나는 그것을 재현 할 수 없습니다입니다. 나는 MobileInstallationLookup 프레임 워크 (private api)와 관련이 있다고 생각하지만 확신 할 수 없다.

-(NSMutableArray *)getInstalled 

는 스택 추적에 존재하지 않는 이유는 나를 위해 분명하지 않다

, 만 ??? 이 0x0 + 내 돈이 라인에 0

+0

그냥 콜 스택입니다 (충돌이 발생한 위치를 보여줍니다). 실제 충돌은 보고서에서 위에 있었을 것입니다. – jrturton

+0

예외 중단 점을 추가하여 충돌을 일으키는 행을 찾으십시오. 이런 호출 스택에 의존하지 마십시오. – Fogmeister

+0

약간의 인터넷 검색 결과,'MobileInstallationLookup'은 사적인 Apple API'MobileInstallation'의 일부라는 것을 알게되었습니다. 그래서 나는 그것이 거부 될까봐 당신이 애플 앱 스토어에 이것을 제출하는 것에 대해 생각하지 않기를 바랍니다. – Popeye

답변

2

:

MobileInstallationLookup = dlsym(RTLD_DEFAULT, "MobileInstallationLookup"); 
NSDictionary *apps = (__bridge NSDictionary *)((__bridge void*)MobileInstallationLookup(options)); 
  • MobileInstallationLookup 글로벌 분명이지만, 왜 확실하지 않다; 예를 들어 그것이 글로벌이라면 왜이 방법으로 재 할당되고 왜 변수는 대문자로 시작합니까 (이것은 틀에 얽매이지 않습니다)?
  • dlsym()이 성공했는지 확인하는 검사가 없으며 널 포인터를 역 참조하면 충돌이 발생할 수 있습니다.
+0

나만 아니라 'MobileInstallationLookup'이 무엇 이길 희망 하나? – Popeye

+0

MobileInstallationLookup이 실제로 호출되므로 dlsym은 NULL을 반환하고 MobileInstallationLookup을 검사하지 않고 호출하면 우리가 보는 스택 추적이 정확하게 생성됩니다. – gnasher729

+0

@Popeye 함수 포인터 여야합니다. – trojanfoe