2

アプリケーション (SymSteam) にバグがあり、特に修正に苦労しています。私のアプリケーションがログイン項目として起動されると、正常に起動しますが、数秒後にクラッシュするようです。アプリケーションがユーザーによって (つまり、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

最初の 2 行は、アプリケーションが正常に起動し、必要な 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

ログイン時に起動されていない場合でもアプリケーションがクラッシュせず、ログイン時に起動された場合でもアプリケーションは起動しますが、数秒後にクラッシュするため、問題の原因について困惑しています。バグはログイン時にのみ発生するため、ブレークポイントを設定したり、プログラムでインストゥルメントを使用したりできないため、このバグをデバッグする方法がわかりません。

これをデバッグする方法についてのアドバイスは大歓迎です!

価値のあることとして、私のアプリケーションはバックグラウンド アプリケーションであり (ドック アイコンやメイン ウィンドウはありません)、Growl & Sparkleフレームワークを使用し、起動時に NSWorkspace からの通知を登録します。

アップデート:

アプリケーションの起動時に実行されるコードを次に示します (メソッド内の無関係なコードはapplicationDidFinishLaunching:省略されています)。上で述べたように、これはすべてクラッシュの前に実行されます。

applicationDidFinishLaunching メソッド:

- (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前述のように、ログイン時にアプリケーションが起動されたときにのみ発生します。アプリケーションが実際に何もしていないときに発生します。

4

1 に答える 1

1

私はもう少しデバッグを行い、自分の質問を解決することができました。クラッシュの全体的な原因はまったく興味深いものではありませんが、次のとおりです。

ユーザーがログインすると、アプリケーションは正常に起動し、NSWorkspace からのドライブのマウント/アンマウントの通知を登録しています。通知を登録した直後に、ログイン中に /home と /net のマウントに関する 2 つの通知を受け取ります。セレクターはdidMountDrive:通知によって実行され、didMountDrive:メソッド内で、マウントされたばかりのドライブの 3 番目のパス コンポーネントを取得しようとしています (マウントされている外部ドライブの場合、これはドライブの名前になるため)。 . /home と /net の URL には 2 つのパス コンポーネントしかないため、ここでプログラムがクラッシュします。そのため、URL の pathComponents 配列の範囲外にあるインデックスにアクセスしようとしています。

修正は、マウントされたばかりのドライブの URL に少なくとも 3 つのパス コンポーネントがあることを確認するだけでした。

于 2012-08-05T11:47:21.623 に答える