1. croso

    No comment

    croso
Changes in title
-VVDocumenterSettingでクラッシュしたので
+VVDocumenterSettingがクラッシュしたので
Changes in body
Source | HTML | Preview

Xcodeで見栄えするコメントを挿入してくれることで便利なプラグインVVDocumenterSettingがクラッシュしました。

事象はコメント自動挿入時(///と入力した時)、何も言わずにXcodeごとクラッシュするという。。(クラッシュログを記事一番最後に載せています)

ソースを追ってみると、SDKが古かったことが根本原因と分かりました。
環境は下記で、

Xcode:6.1
MacOSのバージョンが10.8(Mountain Lion)

クラッシュしたのは「VVDocumenterSetting.m」の
「-(NSInteger) keyVCodet;」にある
「localizedCaseInsensitiveContainsString」
というNSStringのメンバメソッド。

これがMacOSのバージョン10.10(MacOSX Yosemite)からしか対応していないのに、自分の環境が10.8だったためSDKが古く、メソッドが見つからなかったみたいです。

なので、下記のようにメソッドをコメント化して対応しました。

VVDocumenterSetting.m

-(NSInteger) keyVCode
{
//    TISInputSourceRef inputSource = TISCopyCurrentKeyboardLayoutInputSource();
//    NSString *layoutID = (__bridge NSString *)TISGetInputSourceProperty(inputSource, kTISPropertyInputSourceID);
//    CFRelease(inputSource);
//
//    // Possible dvorak layout SourceIDs:
//    //    com.apple.keylayout.Dvorak (System Qwerty)
//    // But exclude:
//    //    com.apple.keylayout.DVORAK-QWERTYCMD (System Qwerty ⌘)
//    //    org.unknown.keylayout.DvorakImproved-Qwerty⌘ (http://www.macupdate.com/app/mac/24137/dvorak-improved-keyboard-layout)
//    if ([layoutID localizedCaseInsensitiveContainsString:@"dvorak"] &&
//       ![layoutID localizedCaseInsensitiveContainsString:@"qwerty"]) {
//        return kVK_ANSI_Period;
//    }
//
//    // Possible workman layout SourceIDs (https://github.com/ojbucao/Workman):
//    //    org.sil.ukelele.keyboardlayout.workman.workman
//    //    org.sil.ukelele.keyboardlayout.workman.workmanextended
//    //    org.sil.ukelele.keyboardlayout.workman.workman-io
//    //    org.sil.ukelele.keyboardlayout.workman.workman-p
//    //    org.sil.ukelele.keyboardlayout.workman.workman-pextended
//    //    org.sil.ukelele.keyboardlayout.workman.workman-dead
//    if ([layoutID localizedCaseInsensitiveContainsString:@"workman"]) {
//        return kVK_ANSI_B;
//    }

    return kVK_ANSI_V;
}

やっていることはキーボード配列を取得 → ペースト(cmd+V)のキーコードを取得
としたいようです。

自分はMacBook Pro単体でしかXcodeを使用しないので、キーボード配列がコロコロ変わることはありません。ベタ書きでも構いません。なのでreturn kVK_ANSI_V;だけ残す対処にしました

このプラグイン、コメント文の挿入のために、クリップボードを経由していることがわかりました。

また根本対処としてはXcodeの新しいバージョンをインストールするほうが正解です。

クラッシュログ
Process:         Xcode [33105]
Path:            /Applications/Xcode.app/Contents/MacOS/Xcode
Identifier:      com.apple.dt.Xcode
Version:         6.1 (6604)
Build Info:      IDEFrameworks-6604000000000000~2
App Item ID:     497799835
App External ID: 752282650
Code Type:       X86-64 (Native)
Parent Process:  launchd [281]
Responsible:     Xcode [33105]
User ID:         501

Date/Time:       2016-02-27 19:23:14.839 +0900
OS Version:      Mac OS X 10.9.4 (13E28)
Report Version:  11

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

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000

Application Specific Information:
ProductBuildVersion: 6A1052d
UNCAUGHT EXCEPTION (NSInvalidArgumentException): -[__NSCFString localizedCaseInsensitiveContainsString:]: unrecognized selector sent to instance 0x7fb8169ddd10
UserInfo: (null)
Hints: None
Backtrace:
  0  0x00007fff950cc244 __exceptionPreprocess (in CoreFoundation)
  1  0x000000010e5b82f4 DVTFailureHintExceptionPreprocessor (in DVTFoundation)
  2  0x00007fff939cae75 objc_exception_throw (in libobjc.A.dylib)
  3  0x00007fff950cf12d -[NSObject(NSObject) doesNotRecognizeSelector:] (in CoreFoundation)
  4  0x00007fff9502a272 ___forwarding___ (in CoreFoundation)
  5  0x00007fff95029df8 _CF_forwarding_prep_0 (in CoreFoundation)
  6  0x000000011d7d7ab9 -[VVDocumenterSetting keyVCode] (in VVDocumenter-Xcode)
  7  0x000000011d7c9b56 -[VVDocumenterManager textStorageDidChange:] (in VVDocumenter-Xcode)
  8  0x00007fff9509ae0c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ (in CoreFoundation)
  9  0x00007fff94f8e82d _CFXNotificationPost (in CoreFoundation)
 10  0x00007fff9454f7ba -[NSNotificationCenter postNotificationName:object:userInfo:] (in Foundation)
 11  0x000000010e598d1e -[NSNotificationCenter(DVTNSNotificationCenterAdditions) _dvt_postNotificationName:object:userInfo:] (in DVTFoundation)
 12  0x00007fff8f49a1b4 -[NSTextView(NSSharing) didChangeText] (in AppKit)
 13  0x000000010ea618bc -[DVTSourceTextView didChangeText] (in DVTKit)
 14  0x00007fff8f4972c2 -[NSTextView insertText:replacementRange:] (in AppKit)
 15  0x000000010ea61529 -[DVTCompletingTextView insertText:replacementRange:] (in DVTKit)
 16  0x00007fff8f4cc177 -[NSTextView insertText:] (in AppKit)
 17  0x000000010ea60de7 -[DVTSourceTextView insertText:] (in DVTKit)
 18  0x00007fff8f4966c7 -[NSTextInputContext insertText:replacementRange:] (in AppKit)
 19  0x00007fff8f495978 -[NSTextInputContext handleTSMEvent:] (in AppKit)
 20  0x00007fff8f493905 _NSTSMEventHandler (in AppKit)
 21  0x00007fff94c4f1d4 DispatchEventToHandlers(EventTargetRec*, OpaqueEventRef*, HandlerCallRec*) (in HIToolbox)
 22  0x00007fff94c4e787 SendEventToEventTargetInternal(OpaqueEventRef*, OpaqueEventTargetRef*, HandlerCallRec*) (in HIToolbox)
 23  0x00007fff94c62880 SendEventToEventTarget (in HIToolbox)
 24  0x00007fff94ca3d0d SendTSMEvent (in HIToolbox)
 25  0x00007fff94ca389b SendUnicodeTextAEToUnicodeDoc (in HIToolbox)
 26  0x00007fff94ca3595 TSMKeyEvent (in HIToolbox)
 27  0x00007fff94c902b7 TSMProcessRawKeyEvent (in HIToolbox)
 28  0x00007fff8f493150 -[NSTextInputContext handleEvent:] (in AppKit)
 29  0x00007fff8f4729dd -[NSView interpretKeyEvents:] (in AppKit)
 30  0x00007fff8f492d6d -[NSTextView keyDown:] (in AppKit)
 31  0x00007fff8f43f56b -[NSWindow sendEvent:] (in AppKit)
 32  0x000000010f81a54b -[IDEWorkspaceWindow sendEvent:] (in IDEKit)
 33  0x00007fff8f3e0b32 -[NSApplication sendEvent:] (in AppKit)
 34  0x000000010f5c37f4 -[IDEApplication sendEvent:] (in IDEKit)
 35  0x00007fff8f2309f9 -[NSApplication run] (in AppKit)
 36  0x00007fff8f21b783 NSApplicationMain (in AppKit)
 37  0x00007fff89ee25fd start (in libdyld.dylib)
 38  0x0000000000000001