Objective c Cocoa应用程序在登录时启动时崩溃

Objective c Cocoa应用程序在登录时启动时崩溃,objective-c,cocoa,Objective C,Cocoa,我在我的应用程序(SymSteam)中发现了一个bug,我正经历一段特别艰难的时间来修复它。似乎每当我的应用程序作为登录项启动时,它都会成功启动,但几秒钟后就会崩溃。如果应用程序是由用户启动的(即通过Finder),它将正常运行且不会崩溃 登录后立即检查控制台,我看到以下内容: 04/08/2012 18:51:47.437 SymSteam[187]: SteamApps exists & SteamAppsSymb exists, suggesting everything is A

我在我的应用程序(SymSteam)中发现了一个bug,我正经历一段特别艰难的时间来修复它。似乎每当我的应用程序作为登录项启动时,它都会成功启动,但几秒钟后就会崩溃。如果应用程序是由用户启动的(即通过Finder),它将正常运行且不会崩溃

登录后立即检查控制台,我看到以下内容:

04/08/2012 18:51:47.437 SymSteam[187]: SteamApps exists & SteamAppsSymb exists, suggesting everything is A-OK.
04/08/2012 18:51:47.451 SymSteam[187]: Succesfully started observing everything I need to
04/08/2012 18:51:52.623 com.apple.launchd.peruser.501[124]: ([0x0-0x16016].com.simplecode.SymSteam[187]) Job appears to have crashed: Segmentation fault: 11
前两行表示my应用程序启动良好,能够从NSWorkspace的通知中心注册所需的通知。我不知道是什么导致了分割错误

还有一份坠机报告。以下是它的摘录:

OS Version:      Mac OS X 10.8 (12A269)
Report Version:  10

Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: EXC_I386_GPFLT

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                 0x00007fff80902278 _cache_getImp + 4
1   libobjc.A.dylib                 0x00007fff80903f51 lookUpMethod + 41
2   libobjc.A.dylib                 0x00007fff80905d5e class_respondsToSelector + 31
3   com.apple.CoreFoundation        0x00007fff82adb7ab objectIsKindOfClass + 43
4   com.apple.CoreFoundation        0x00007fff82adb812 __exceptionMatch + 18
5   libobjc.A.dylib                 0x00007fff8090d1d4 _objc_exception_do_catch(objc_typeinfo*, objc_typeinfo*, void**, unsigned int) + 144
6   libc++abi.dylib                 0x00007fff81621807 get_adjusted_ptr(std::type_info const*, std::type_info const*, void**) + 71
7   libc++abi.dylib                 0x00007fff81621439 __gxx_personality_v0 + 889
8   libunwind.dylib                 0x00007fff8b678c22 _Unwind_RaiseException + 158
9   libc++abi.dylib                 0x00007fff81621baa __cxa_rethrow + 72
10  libobjc.A.dylib                 0x00007fff8090d5f5 objc_exception_rethrow + 40
11  com.apple.CoreFoundation        0x00007fff82a7ce36 CFRunLoopRunSpecific + 390
12  com.apple.HIToolbox             0x00007fff8c855774 RunCurrentEventLoopInMode + 209
13  com.apple.HIToolbox             0x00007fff8c855512 ReceiveNextEventCommon + 356
14  com.apple.HIToolbox             0x00007fff8c8553a3 BlockUntilNextEventMatchingListInMode + 62
15  com.apple.AppKit                0x00007fff87afefa3 _DPSNextEvent + 685
16  com.apple.AppKit                0x00007fff87afe862 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128
17  com.apple.AppKit                0x00007fff87af5c03 -[NSApplication run] + 517
18  com.apple.AppKit                0x00007fff87a9a656 NSApplicationMain + 869
19  com.simplecode.SymSteam         0x0000000108df4d54 start + 52

Thread 1:
0   libsystem_kernel.dylib          0x00007fff82dad6d6 __workq_kernreturn + 10
1   libsystem_c.dylib               0x00007fff84c27f2c _pthread_workq_return + 25
2   libsystem_c.dylib               0x00007fff84c27cf3 _pthread_wqthread + 412
3   libsystem_c.dylib               0x00007fff84c121b1 start_wqthread + 13

Thread 2:: Dispatch queue: com.apple.libdispatch-manager
0   libsystem_kernel.dylib          0x00007fff82dadd16 kevent + 10
1   libdispatch.dylib               0x00007fff81bafe26 _dispatch_mgr_invoke + 883
2   libdispatch.dylib               0x00007fff81bafa2a _dispatch_mgr_thread + 54

Thread 3:
0   libsystem_kernel.dylib          0x00007fff82dad6d6 __workq_kernreturn + 10
1   libsystem_c.dylib               0x00007fff84c27f2c _pthread_workq_return + 25
2   libsystem_c.dylib               0x00007fff84c27cf3 _pthread_wqthread + 412
3   libsystem_c.dylib               0x00007fff84c121b1 start_wqthread + 13

Thread 4:
0   libsystem_kernel.dylib          0x00007fff82dad6d6 __workq_kernreturn + 10
1   libsystem_c.dylib               0x00007fff84c27f2c _pthread_workq_return + 25
2   libsystem_c.dylib               0x00007fff84c27cf3 _pthread_wqthread + 412
3   libsystem_c.dylib               0x00007fff84c121b1 start_wqthread + 13

Thread 0 crashed with X86 Thread State (64-bit):
  rax: 0x1000000000000000  rbx: 0x00007fff70bf5810  rcx: 0x0000000000000001  rdx: 0x0000000000000000
  rdi: 0x1000000000000000  rsi: 0x00007fff88323f93  rbp: 0x00007fff56e0b910  rsp: 0x00007fff56e0b8d0
   r8: 0x0000000000000000   r9: 0x0000000000000000  r10: 0x00000000510558d1  r11: 0x1000000000000000
  r12: 0x0000000000000000  r13: 0x0000000000000000  r14: 0x1000000000000000  r15: 0x00007fff88323f93
  rip: 0x00007fff80902278  rfl: 0x0000000000010202  cr2: 0x00007fff88424000
Logical CPU: 0
我不知道是什么导致了这个问题,因为应用程序在登录时没有启动就不会崩溃,即使在登录时启动,它也会启动,但几秒钟后就会崩溃。我不知道如何调试这个bug,因为我不能在程序上设置断点或使用工具,因为这个bug只发生在登录时

任何关于如何进行调试的建议都将不胜感激

值得一提的是,我的应用程序是一个后台应用程序(因此它没有停靠图标或主窗口),它使用&frameworks并在启动时从NSWorkspace注册通知

更新:

下面是启动我的应用程序时执行的代码(省略了
applicationdFinishLaunching:
方法中的一些无关代码)。正如我上面所说的,这些都是在崩溃之前执行的

ApplicationIDFinish启动方法:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
    [self.appController performInitialDriveScan];
    [self.appController startWatchingDrives];
}
performInitialDriveScan:
只需使用NSFileManager几次,查看是否存在某些目录。我不会把它贴在这里,因为它很长。我很有信心这不是坠机的原因

startWatchingDrives

- (void)startWatchingDrives{
    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self.saController selector:@selector(didMountDrive:) name:NSWorkspaceDidMountNotification object:nil];
    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self.saController selector:@selector(didUnMountDrive:) name:NSWorkspaceDidUnmountNotification object:nil];
    NSLog(@"Succesfully started observing everything I need to");
}
这只是在NSWorkspace的通知中心添加了一个观察者,用于监视正在安装/卸载的驱动器


这就是应用程序启动期间执行的所有操作。崩溃发生在调用
startWatchingDrives
方法之后,如上所述,只有在登录时启动应用程序时才会发生。它发生在我的应用程序实际上没有做任何事情的时候

我做了更多的调试,并设法解决了我自己的问题。坠机的总体原因很无趣,但具体原因如下:

当用户登录并从NSWorkspace注册驱动器装载/卸载通知时,应用程序将正常启动。在注册通知后,它几乎立即收到两个关于在登录期间挂载/home和/net的通知。
didMountDrive:
选择器由通知执行,在
didMountDrive:
方法中,我试图获取刚刚装入的驱动器的URL的第三路径组件(因为,如果是装入的外部驱动器,这将是驱动器的名称)。这就是程序崩溃的地方,因为/home和/net URL只有两个路径组件,所以我尝试访问URL的pathComponents数组范围之外的索引


修复方法只是检查刚刚安装的驱动器的URL中是否至少有3个路径组件

这就是问题的一半,我不知道该发布什么代码,因为我找不到崩溃的根源。我将添加启动应用程序时执行的代码,但我不确定它是否会有多大帮助。请尝试使用NSZombies,并发布您得到的内容。@Programmer20005 NSZombies没有多大帮助,因为只有在登录时启动应用程序时,当我没有访问Xcode或Instruments的权限时,才会发生崩溃。无论如何,我在应用程序中启用了NSZombies,但它在Console.app中没有产生任何输出。