ios应用程序崩溃没有错误(即使通过按钮点击调用空操作)

时间:2013-04-20 19:54:34

标签: ios error-handling crash

我发现了类似的问题,但没有一个解决了我的问题。

有一些viewcontrollers和工作应用程序。

我向其中一个viewcontrollers添加了一个按钮,并绑定了一个“sampleclick”动作。此操作中没有任何内容(没有代码,没有行,只是一个空方法),应用程序崩溃并跟随以下块:

所有输出日志:

(lldb)

和堆叠:

libobjc.A.dylib`objc_msgSend:
0x10ed08c:  movl   8(%esp), %ecx
0x10ed090:  movl   4(%esp), %eax
0x10ed094:  testl  %eax, %eax
0x10ed096:  je     0x10ed0e8                 ; objc_msgSend + 92
0x10ed098:  movl   (%eax), %edx
0x10ed09a:  pushl  %edi
0x10ed09b:  movl   8(%edx), %edi
0x10ed09e:  pushl  %esi
***0x10ed09f:  movl   (%edi), %esi   >>> crashes here with :Thread1:EXC_BAD_ACCESS*** (code=1,address: .....)
0x10ed0a1:  movl   %ecx, %edx
0x10ed0a3:  shrl   $2, %edx
0x10ed0a6:  andl   %esi, %edx
0x10ed0a8:  movl   8(%edi,%edx,4), %eax
0x10ed0ac:  testl  %eax, %eax
0x10ed0ae:  je     0x10ed0b9                 ; objc_msgSend + 45
0x10ed0b0:  cmpl   (%eax), %ecx
0x10ed0b2:  je     0x10ed0d0                 ; objc_msgSend + 68
0x10ed0b4:  addl   $1, %edx
0x10ed0b7:  jmp    0x10ed0a6                 ; objc_msgSend + 26
0x10ed0b9:  popl   %esi
0x10ed0ba:  popl   %edi
0x10ed0bb:  movl   4(%esp), %edx
0x10ed0bf:  movl   (%edx), %eax
0x10ed0c1:  jmp    0x10ed0d9                 ; objc_msgSend + 77
0x10ed0c3:  nopw   %cs:(%eax,%eax)

3 个答案:

答案 0 :(得分:5)

您的问题的一个可能答案是您尝试将消息发送到对象的已释放实例。

尝试搜索zoombies(按 R ,选择诊断标签并激活启用Zombie Objects )。每个发布的对象都将成为NSZombie的一个实例,如果您尝试访问它们而不是崩溃,它们会将消息记录到控制台。

此外,在ARM体系结构(涉及iOS)上,r0应指向消息的接收者。你可以尝试调查一下。它可能会产生有用的信息。 (在调试器上使用p/x $r0命令。如果执行x/s $r1,则应获取选择器名称。)

注意:
如果您要调试objc_msgSend()内发生的崩溃,我强烈建议您查看Hamster Emporium存档上的[objc explain]: So you crashed in objc_msgSend()。它包含有价值的提示&从调试器中获取大部分信息的技巧以及调查崩溃发生的原因。

编辑:根据评论,但没有代码,人们只能猜测代码中某处一个对象(可能是detailviewcontroller)注册的事件但是很快就被解除了分配。因此发送动作时崩溃。这只是一个提示,但恕我直言,值得在调试器中进行调查。

答案 1 :(得分:1)

我明白了!!!!

我通过逐步删除每个操作和属性的整个应用程序来解决它,并找到了罪魁祸首: (也许可以帮助有同样问题的人)

detailsviewcontroller是一个典型的uiviewcontroller,它是通过以下代码打开的:

    detailviewcontroller *vc = [[detailviewcontroller alloc] initWithNibName:@"detailviewcontroller" bundle:nil];
[self.view addSubview:vc.view];

我替换为以下代码(刚删除了detailviewcontroller单词和*),问题解决了:

    vc = [[detailviewcontroller alloc] initWithNibName:@"detailviewcontroller" bundle:nil];
[self.view addSubview:vc.view];

这也表明我应该为声明研究目标c;)

答案 2 :(得分:0)

这是.m文件:

#import "detailviewcontroller.h"

@interface detailviewcontroller ()

@end

@implementation detailviewcontroller

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
}

-(IBAction)denemecik:(id)sender
{
// there is no code here 
}

- (void)viewDidLoad
{
[super viewDidLoad];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
//NSLog(@"memori warning aldım");
// Dispose of any resources that can be recreated.
}

这是.h文件:

#import <UIKit/UIKit.h>
@interface detailviewcontroller : UIViewController
{
}
-(IBAction)denemecik:(id)sender;
@end

和xib视图:视图上只有一个按钮,我只需单击它