2010-08-31 80 views
0

我創建了這款真棒的iPad遊戲 - 玩起來既乾淨又有趣,而且設法玩過它的人不止一次喜歡它。 然而,在某些情況下,它不會第二次啓動。iPad應用程序可以在大多數設備上運行,在某些設備上獲取EXC_CRASH(SIGABRT)

我無法調試它,因爲它可以在我的iPad,模擬器和我所有朋友的iPad上完美工作。 有一位顧客告訴我,它適用於32GB,但不適用於64GB的iPad - 這可能嗎?

任何幫助,將不勝感激 - 這是我的那顆評級(和一個很好的理由,可惜)

很樂意給了促銷代碼給任何人願意看這個。

謝謝! Hanaan

從我的AppDelegate,如果幫助:

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

self.playerName = [[NSUserDefaults standardUserDefaults] objectForKey:@"player_name"]; 
if(self.playerName == nil){ 
    self.playerName = @"nono"; 

    self.pref_currentPuzzleNumberHintsString = @""; 
    self.pref_currentPuzzleFinishedSolutionString = @""; 
    self.pref_currentPlayerMarksString = @""; 
    self.pref_marksCompleteString = @""; 
    self.pref_currentPuzzleId = -1; 

    self.pref_gameInProgress = NO; 
    self.pref_soundOn = YES; 
    self.pref_buttonsOnLeft = NO; 
    self.pref_gameTimerValue = 0; 
    self.pref_gameSize = 0; 

    NSNumber *pref_gameInProgress_temp = [NSNumber numberWithInt:0]; 
    NSNumber *pref_soundOn_temp = [NSNumber numberWithInt:1]; 
    NSNumber *pref_buttonsOnLeft_temp = [NSNumber numberWithInt:0]; 
    NSNumber *pref_gameNumber_temp = [NSNumber numberWithInt:self.pref_currentPuzzleId]; 
    NSNumber *pref_gameSize_temp = [NSNumber numberWithInt:self.pref_gameSize]; 
    NSNumber *pref_gameTimer_temp = [NSNumber numberWithInt:self.pref_gameTimerValue]; 


    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 

    [standardUserDefaults setObject:self.pref_currentPuzzleFinishedSolutionString forKey:@"game_string"]; 
    [standardUserDefaults setObject:self.pref_currentPuzzleNumberHintsString forKey:@"hint_string"]; 
    [standardUserDefaults setObject:self.pref_currentPlayerMarksString forKey:@"solution_string"]; 
    [standardUserDefaults setObject:self.pref_marksCompleteString forKey:@"marks_complete_string"]; 

    [standardUserDefaults setObject:pref_gameNumber_temp forKey:@"game_id"]; 
    [standardUserDefaults setObject:pref_gameSize_temp forKey:@"game_size"]; 
    [standardUserDefaults setObject:pref_gameTimer_temp forKey:@"game_timer_value"]; 

    [standardUserDefaults setObject:pref_gameInProgress_temp forKey:@"game_in_progress"]; 
    [standardUserDefaults setObject:pref_soundOn_temp forKey:@"sound_on"]; 
    [standardUserDefaults setObject:pref_buttonsOnLeft_temp forKey:@"buttons_on_left"]; 

    [standardUserDefaults setObject:self.playerName forKey:@"player_name"]; 

    [[NSUserDefaults standardUserDefaults] synchronize]; 

    [pref_gameInProgress_temp release]; 
    [pref_gameSize_temp release]; 
    [pref_soundOn_temp release]; 
    [pref_gameTimer_temp release]; 
    [pref_gameNumber_temp release]; 
    [pref_buttonsOnLeft_temp release]; 

}else { 
    self.pref_currentPlayerMarksString = [[NSUserDefaults standardUserDefaults] objectForKey:@"game_string"]; 
    self.pref_currentPuzzleNumberHintsString = [[NSUserDefaults standardUserDefaults] objectForKey:@"hint_string"]; 
    self.pref_currentPuzzleFinishedSolutionString = [[NSUserDefaults standardUserDefaults] objectForKey:@"solution_string"]; 
    self.pref_marksCompleteString = [[NSUserDefaults standardUserDefaults] objectForKey:@"marks_complete_string"]; 

    self.pref_currentPuzzleId = [[[NSUserDefaults standardUserDefaults] objectForKey:@"game_id"]intValue]; 

    self.pref_gameSize = [[[NSUserDefaults standardUserDefaults] objectForKey:@"game_size"]intValue]; 
    self.pref_gameTimerValue = [[[NSUserDefaults standardUserDefaults] objectForKey:@"game_timer_value"]intValue]; 

    int pref_gameInProgress_temp = [[[NSUserDefaults standardUserDefaults] objectForKey:@"game_in_progress"]intValue]; 
    self.pref_gameInProgress = (pref_gameInProgress_temp == 1); 

    int pref_soundOn_temp = [[[NSUserDefaults standardUserDefaults] objectForKey:@"sound_on"]intValue]; 
    self.pref_soundOn = (pref_soundOn_temp == 1); 

    int pref_buttonsOnLeft_temp = [[[NSUserDefaults standardUserDefaults] objectForKey:@"buttons_on_left"]intValue]; 
    self.pref_buttonsOnLeft = (pref_buttonsOnLeft_temp == 1); 
    //NSLog(@"Saved game: %@",self.pref_currentPlayerMarksString); 
} 


// Add the view controller's view to the window and display. 
[window addSubview:viewController.view]; 
[window makeKeyAndVisible]; 

return YES; 
} 

從顧客那裏得到的日誌有這樣的:

-

Incident Identifier: 1581089C-C02A-4155-9493-9E42B9AAB37D 
CrashReporter Key: a913e5f82c7112b47b354f04909239bff1b39000 
Hardware Model:  iPad1,1 
Process:   Nonograms [193] 
Path:   /var/mobile/Applications/4F03245E-CFB8-4181-B881-859FDAEE18C7/Nonograms.app/Nonograms 
Identifier:  Nonograms 
Version:   ??? (???) 
Code Type:  ARM (Native) 
Parent Process: launchd [1] 

Date/Time:  2010-08-21 16:31:11.002 +0200 
OS Version:  iPhone OS 3.2.2 (7B500) 
Report Version: 104 

SYMBOLIZED: 

Exception Type: EXC_CRASH (SIGABRT) 
Exception Codes: 0x00000000, 0x00000000 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libSystem.B.dylib    0x000790a0 __kill + 8 
1 libSystem.B.dylib    0x00079090 kill + 4 
2 libSystem.B.dylib    0x00079082 raise + 10 
3 libSystem.B.dylib    0x0008d20a abort + 50 
4 libstdc++.6.dylib    0x00044a1c __gnu_cxx::__verbose_terminate_handler() + 376 
5 libobjc.A.dylib     0x000057c4 _objc_terminate + 104 
6 libstdc++.6.dylib    0x00042dee __cxxabiv1::__terminate(void (*)()) + 46 
7 libstdc++.6.dylib    0x00042e42 std::terminate() + 10 
8 libstdc++.6.dylib    0x00042f12 __cxa_throw + 78 
9 libobjc.A.dylib     0x000046a4 objc_exception_throw + 64 
10 CoreFoundation     0x00094174 -[NSObject doesNotRecognizeSelector:] + 108 
11 CoreFoundation     0x00093afa ___forwarding___ + 482 
12 CoreFoundation     0x000306c8 _CF_forwarding_prep_0 + 40 
13 Nonograms      0x00003238 0x1000 + 8760 
14 UIKit       0x00003e58 -[UIApplication _performInitializationWithURL:payload:] + 336 
15 UIKit       0x00003b22 -[UIApplication _runWithURL:payload:launchOrientation:] + 394 
16 UIKit       0x0004f8c4 -[UIApplication handleEvent:withNewEvent:] + 1336 
17 UIKit       0x0004f242 -[UIApplication sendEvent:] + 38 
18 UIKit       0x0004ec8c _UIApplicationHandleEvent + 4772 
19 GraphicsServices    0x00003b2c PurpleEventCallback + 660 
20 CoreFoundation     0x00022d96 CFRunLoopRunSpecific + 2214 
21 CoreFoundation     0x000224da CFRunLoopRunInMode + 42 
22 UIKit       0x0000340a -[UIApplication _run] + 342 
23 UIKit       0x00001954 UIApplicationMain + 636 
24 Nonograms      0x00002538 0x1000 + 5432 
25 Nonograms      0x00002508 0x1000 + 5384 

回答

0

我不知道的細節iPad和obj-c的開發。 但是,這看起來像內存損壞和/或懸掛指針在某種程度上。

例如,您可能正在修改超出其範圍的數組。仔細檢查所有循環並添加驗證邊界的調試斷言。

另一種可能性是,您可能正在使用指向已刪除對象的指針,並且寫入/解釋此內存具有未定義的效果。通常它只是崩潰。

或者你可能有未初始化的指針。

所有這些都屬於我喜歡稱之爲「在C/C++/etc中開發應用程序的瘋狂」的範疇。未經檢查的緩衝區限制,手動內存釋放以及無用的調用堆棧內存只是對現代應用程序開發的堅定想法。

+0

Mangus - 奇怪的是,該應用程序在大多數iPad上運行良好。 只有一些崩潰,但他們都顯示相同的模式: 第一次發射成功,玩遊戲,有爆炸 第二次發射和之後,立即崩潰:-( – 2010-09-01 04:05:29

1

您需要找到堆棧跟蹤幀13所代表的代碼行。

我希望你使用了最近版本的Xcode的「構建和存檔」功能。在這種情況下,您只需將故障日誌拖放到Xcode Organizer即可。這將「符號化」崩潰日誌,這意味着它將地址轉換爲類和方法。

一旦你知道導致錯誤的那一行,它將(希望)相對簡單地找出錯誤。我的猜測會是一些描述的內存損壞 - 你假設你在第一次運行時保存的值不存在或不存在。

+0

斯蒂芬 - 我把帖子改爲符號化版本 - 請採取 謝謝! Hanaan – 2010-09-01 04:24:02

+0

看起來它沒有正確的符號。你可以看到操作系統內部發生了什麼,但不是在Nonograms中。你的代碼調用了一個不存在的選擇器(方法)。確定哪種方法,但我猜它是在應用程序委託,在你的啓動序列的某處 – 2010-09-01 09:36:33

+0

是的,我看到 - 我正在尋找的答案是: 13 Nonograms \t 0x00003238 0x1000 + 8760 任何想法如何得到這個林e破譯? – 2010-09-01 10:52:26

1

這個問題是無主的釋放對象...

[pref_gameInProgress_temp release]; 
[pref_gameSize_temp release]; 
[pref_soundOn_temp release]; 
[pref_gameTimer_temp release]; 
[pref_gameNumber_temp release]; 
[pref_buttonsOnLeft_temp release]; 
相關問題