iPad 应用程序适用于大多数设备,在某些设备上获得 EXC_CRASH (SIGABRT)

Posted

技术标签:

【中文标题】iPad 应用程序适用于大多数设备,在某些设备上获得 EXC_CRASH (SIGABRT)【英文标题】:iPad app works on most devices, gets EXC_CRASH (SIGABRT) on some 【发布时间】:2010-08-31 12:37:30 【问题描述】:

我制作了这款很棒的 iPad 游戏 - 干净有趣,玩过不止一次的人都喜欢它。 但是,在某些情况下,它不会第二次启动。

我无法调试它,因为它在我的 iPad、模拟器和我朋友的所有 iPad 上都能完美运行。 一位客户告诉我,它可以在 32GB 的 iPad 上运行,但在 64GB 的 iPad 上不可用 - 是这样吗?

任何帮助将不胜感激 - 这正在降低我的收视率(不幸的是,这是有充分理由的)

很乐意将促销代码提供给愿意调查此问题的任何人。

谢谢!! 哈南

来自我的 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

【问题讨论】:

【参考方案1】:

您需要找到堆栈跟踪的第 13 帧所代表的代码行。

我希望您使用 Xcode 最新版本的“构建和存档”功能。在这种情况下,您需要做的就是将崩溃日志拖放到 Xcode Organizer。这将“符号化”崩溃日志,这意味着它将地址转换为类和方法。

一旦您知道导致错误的行(希望)就可以相对简单地找出问题所在。我的猜测是某些描述的内存损坏 - 您假设您在第一次运行时保存的值不存在或其他什么。

【讨论】:

Stephan - 我将帖子更改为符号版本 - 请看一下。谢谢!哈南 看起来它没有正确表示。您可以看到操作系统内部发生了什么,但在 Nonograms 内部却看不到。您的代码正在调用一个不存在的选择器(方法)。无法确定是哪种方法,但我猜它在应用程序委托中,在您的启动序列中的某个位置。 是的,我明白了 - 我正在寻找的答案是:13 Nonograms 0x00003238 0x1000 + 8760 知道我是如何破译这条线的吗?【参考方案2】:

我认为您的某些对象或 UI 元素正在被释放(解除分配),但您希望它仍然存在:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/51235-crash-log-help.html

【讨论】:

【参考方案3】:

问题是释放无主对象...

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

【讨论】:

【参考方案4】:

我不知道 iPad 和 obj-c 开发的细节。 但是,这在某种程度上看起来像是内存损坏和/或悬空指针。

例如,您可能正在修改超出其边界的数组。仔细检查所有循环并添加验证边界的调试断言。

另一种可能性是您可能正在使用指向已删除对象的指针,并且写入/解释此内存具有未定义的效果。通常它只是崩溃。

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

所有这些都属于我喜欢称之为用 C/C++/etc 开发应用程序的疯狂的类别。未经检查的缓冲区边界、手动内存释放和无人看管的调用堆栈内存对于现代应用程序开发来说只是疯狂的想法。

【讨论】:

Mangus - 奇怪的是该应用程序在大多数 iPad 上运行良好。只有一些崩溃,但它们都显示相同的模式:第一次启动成功,玩游戏,爆炸第二次启动之后,立即崩溃:-(

以上是关于iPad 应用程序适用于大多数设备,在某些设备上获得 EXC_CRASH (SIGABRT)的主要内容,如果未能解决你的问题,请参考以下文章

MutliTouch 适用于 iPad 模拟器,但不适用于设备

仅适用于 iPad Wifi 所需的设备功能

JayData / Phonegap 适用于 iPad 模拟器但不适用于 iPad 设备

适用于 iPhone 和 iPad 的 iOS 分辨率

使用 HTML5 视频标签时,某些视频在移动设备上显示为白屏

仅适用于单个设备的 Xcode 断点?