我的问题:JavaScript 调用插件,它分叉了一个打开 NSOpenPanel(或 NSSavePanel)对话框的线程。这通常有效,但有时它会在 Firefox 和 Chrome 上的“runModal”上崩溃。崩溃似乎在某些机器(可能是 10.7)上随机发生并且比其他机器更频繁。崩溃的堆栈位置各不相同,但一般发生在打开对话框的线程上。
我使用 POSIX 线程,因为它是跨平台代码,但我确实生成了 NSThread让 Cocoa 知道:
NSThread* t = [[NSThread alloc] init];
[t start];
[t release];
打开对话框的代码:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // necessary?
NSOpenPanel* openPanel = [NSOpenPanel openPanel];
[openPanel setAllowsMultipleSelection:_allowMultipleFiles];
[openPanel setCanChooseFiles:YES];
[openPanel setCanChooseDirectories:YES];
NSInteger result = [openPanel runModal]; // crash
... handle result ...
[pool release];
堆栈跟踪:
Process: plugin-container [25536]
Path: /Applications/Firefox.app/Contents/MacOS/plugin-container.app/Contents/MacOS/plugin-container
Identifier: org.mozilla.plugincontainer
Version: ??? (1.0)
Code Type: X86-64 (Native)
Parent Process: firefox-bin [25531]
Date/Time: 2011-12-09 17:12:04.271 -0800
OS Version: Mac OS X 10.6.8 (10K549)
Report Version: 6
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x000000000000000d
Crashed Thread: 14
Thread 14 Crashed:
0 XUL 0x0000000100d84ff4 mac_plugin_interposing_child_OnSetCursor + 38068
1 XUL 0x0000000100dd38bd mac_plugin_interposing_child_OnSetCursor + 359805
2 XUL 0x0000000100d7b247 mac_plugin_interposing_child_OnHideCursor + 1175
3 com.apple.AppKit 0x00007fff801cbfdb _NSCreateWindowWithOpaqueShape2 + 610
4 com.apple.AppKit 0x00007fff80160691 -[NSWindow _commonAwake] + 1214
5 com.apple.AppKit 0x00007fff803c282f -[NSWindow _setModal:] + 138
6 com.apple.AppKit 0x00007fff803c2183 -[NSApplication _orderFrontModalWindow:relativeToWindow:] + 482
7 com.apple.AppKit 0x00007fff803c1ce7 -[NSApplication _commonBeginModalSessionForWindow:relativeToWindow:modalDelegate:didEndSelector:contextInfo:] + 714
8 com.apple.AppKit 0x00007fff803c1a18 -[NSApplication beginModalSessionForWindow:] + 36
9 com.apple.AppKit 0x00007fff803c193a -[NSApplication runModalForWindow:] + 106
10 XUL 0x0000000100d7af01 mac_plugin_interposing_child_OnHideCursor + 337
11 com.apple.AppKit 0x00007fff80627112 -[NSSavePanel runModal] + 318
12 com.aspera.AsperaWeb 0x000000010509f9d4 Connect::Web::MacOpenFolderDialogImpl::doShow() + 596
13 com.aspera.AsperaWeb 0x00000001050a0fa3 Connect::Web::IDialogImpl::show() + 45
14 com.aspera.AsperaWeb 0x00000001050a1e07 Connect::Web::OpenFolderDialog::showHelper(bool) + 141
15 com.aspera.AsperaWeb 0x00000001050a1ef0 Connect::Web::OpenFolderDialog::run() + 42
16 com.aspera.AsperaWeb 0x000000010509eb91 Connect::Web::SingleJobWorker::run() + 63
17 com.aspera.AsperaWeb 0x0000000105098160 start_helper + 38
18 libSystem.B.dylib 0x00007fff8593afd6 _pthread_start + 331
19 libSystem.B.dylib 0x00007fff8593ae89 thread_start + 13
Thread 14 crashed with X86 Thread State (64-bit):
rax: 0x0000000000000000 rbx: 0x0000000102063840 rcx: 0x0000000000000000 rdx: 0x0000000101e27ee0
rdi: 0x0000000101e0bcc8 rsi: 0x0000000000000000 rbp: 0x0000000101e27ef0 rsp: 0x000000011d5805e0
r8: 0x0000000101e0bcc8 r9: 0x00000001040fc0a4 r10: 0x00007fffffe001a0 r11: 0x0000000000000202
r12: 0x0000000101e27ee0 r13: 0x0000000000000001 r14: 0x000000011d5805e0 r15: 0x000000011d580754
rip: 0x0000000100d84ff4 rfl: 0x0000000000010246 cr2: 0x000000000000000d
我猜在辅助线程上打开对话框存在问题。也许我需要在主线程上打开它?但是,我确实希望保持 JavaScript 调用异步。我正在查看NSNotificationQueue或performSelectorOnMainThread。