일부 Objective-C가 혼합되어 XCode 5로 빌드 된 대형 C ++ 애플리케이션이 있습니다. 앱의 한보기에는 항목 목록이 있습니다. 목록 항목을 드래그 앤 드롭하면 5 ~ 10 회 또는 50 회 정상적으로 작동하지만 결국 드래그하는 동안 앱이 충돌합니다. XCode (릴리스 또는 디버그 빌드)에서 실행할 때 충돌하지 않습니다. 디버그 빌드를 외부에서 실행할 때 충돌하지 않습니다. 릴리스 빌드를 외부에서 실행하는 경우에만 충돌합니다.
다음은 드래그 작업을 시작하는 스 니펫입니다 (dragImage에서 반환하기 전에 충돌이 발생 함).
// start drag
m_bDragging = true;
[[pHost getView]
dragImage:pDragImage
at:ptOffset.getNSPoint()
offset:NSZeroSize
event:pEvent
pasteboard:[NSPasteboard pasteboardWithName:NSDragPboard]
source:[pHost getView]
slideBack:YES];
m_bDragging = false;
[pHost getView]는 NSView 멤버 변수 포인터를 반환합니다. dragImage 및 이벤트에 대해 NULL을 제공하는 동작을 개선하지 않습니다. 대지에는 목록 항목과 관련된 파일 이름 목록이 있습니다.
다음은 일반적인 충돌 보고서입니다 (항상 CFSetGetValue가 포함되어 있음).
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000025900000100
VM Regions Near 0x25900000100:
CG shared images 00000001c871f000-00000001c8727000 [ 32K] r--/r-- SM=SHM
-->
JS JIT generated code 00002ece70800000-00002ece70801000 [ 4K] ---/rwx SM=NUL
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 com.apple.CoreFoundation 0x00007fff9a8c06a9 CFSetGetValue + 25
1 com.apple.CoreFoundation 0x00007fff9a8d81df __CFRunLoopFindMode + 223
2 com.apple.CoreFoundation 0x00007fff9a902a39 CFRunLoopAddTimer + 153
3 com.apple.HIServices 0x00007fff9265bf15 StartIPCPing + 166
4 com.apple.HIToolbox 0x00007fff986956bf __DragInfoPtrSetValueForKey + 160
5 com.apple.HIToolbox 0x00007fff98695616 __CoreDragSetValueForKey + 52
6 com.apple.AppKit 0x00007fff905c968d __50-[NSDragDestination _resetUpdateDraggingItemTimer]_block_invoke + 164
7 libdispatch.dylib 0x00007fff96beb1bb _dispatch_call_block_and_release + 12
8 libdispatch.dylib 0x00007fff96be828d _dispatch_client_callout + 8
9 libdispatch.dylib 0x00007fff96bf0433 _dispatch_after_timer_callback + 77
10 libdispatch.dylib 0x00007fff96be828d _dispatch_client_callout + 8
11 libdispatch.dylib 0x00007fff96bea885 _dispatch_source_invoke + 413
12 libdispatch.dylib 0x00007fff96befe97 _dispatch_main_queue_callback_4CF + 244
13 com.apple.CoreFoundation 0x00007fff9a9404f9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
14 com.apple.CoreFoundation 0x00007fff9a8fb714 __CFRunLoopRun + 1636
15 com.apple.CoreFoundation 0x00007fff9a8fae75 CFRunLoopRunSpecific + 309
16 com.apple.HIToolbox 0x00007fff98634a0d RunCurrentEventLoopInMode + 226
17 com.apple.HIToolbox 0x00007fff986347b7 ReceiveNextEventCommon + 479
18 com.apple.HIToolbox 0x00007fff986345bc _BlockUntilNextEventMatchingListInModeWithFilter + 65
19 com.apple.AppKit 0x00007fff902bb24e _DPSNextEvent + 1434
20 com.apple.AppKit 0x00007fff902ba89b -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 122
21 com.apple.AppKit 0x00007fff905c9170 NSCoreDragBlockingProc + 107
22 com.apple.HIServices 0x00007fff9265a230 SampleMouseAndKeyboard + 102
23 com.apple.HIServices 0x00007fff92659f50 DragInApplication + 50
24 com.apple.HIServices 0x00007fff92659177 CoreDragStartDragging + 519
25 com.apple.AppKit 0x00007fff905c5a54 -[NSCoreDragManager _dragUntilMouseUp:accepted:] + 862
26 com.apple.AppKit 0x00007fff9077d3a4 -[NSCoreDragManager dragImage:fromWindow:at:offset:event:pasteboard:source:slideBack:] + 1355
27 com.apple.AppKit 0x00007fff90a6385b -[NSWindow(NSDrag) d
다른 충돌 로그는 다음과 같이 시작되었습니다.
2014-09-04 19:47:59.659 myApp[47690:507] -[__NSCFNumber member:]: unrecognized selector sent to instance 0x5907
2014-09-04 19:47:59.687 myApp[47690:507] An uncaught exception was raised
2014-09-04 19:47:59.688 myApp[47690:507] -[__NSCFNumber member:]: unrecognized selector sent to instance 0x5907
2014-09-04 19:47:59.688 myApp[47690:507] (
0 CoreFoundation 0x00007fff9a9d925c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff92958e75 objc_exception_throw + 43
2 CoreFoundation 0x00007fff9a9dc12d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x00007fff9a937272 ___forwarding___ + 1010
4 CoreFoundation 0x00007fff9a936df8 _CF_forwarding_prep_0 + 120
5 CoreFoundation 0x00007fff9a8c0721 CFSetGetValue + 145
나는 아이디어가 없습니다. 어떤 도움을 주시면 감사하겠습니다.
이것은 코드의 메모리 관리 버그입니다. 두 번째 충돌 로그는 메시지 -member:
에 응답하지 않는 객체 (NSNumber) 로 메시지 가 전송 되었음을 보여 주며 , 이는 메시지의 대상 이에 응답 하는 클래스 여야한다는 것을 강력하게 제안합니다 -member:
. 이것이 당신 자신의 코드라고 확신 할 수있는 큰 단서입니다. 선을 따라 어딘가에서 이미 릴리스 된 후 개체에 메시지를 보내려고합니다. 끌린 물건을 어딘가에 보관하는 것을 잊었나요? (ARC 또는 가비지 컬렉션을 사용하지 않는 경우) 과다 릴리스했을 수 있습니까? 당신은 당신이 삭제하지 않은 매달린 참조가 있습니까? Dunno.
사용해야하는 도구는 Zombies 악기와 함께 악기입니다. 응용 프로그램을 실행하고 충돌 한 다음 Instruments에서 "좀비 개체에 메시지를 보냈습니다"지점에 플래그를 지정하도록합니다 (이 경우 계측기는 실제로 개체를 해제하지 않고 개체를 유지하고 "좀비"로 표시합니다. -언데드 오브젝트- 보유 수가 0에 도달 한 후 할당 해제 되어야 하는 오브젝트로 전송 된 메시지를 감시합니다 . 팝 오버 메시지의 화살표를 클릭하고 해당 개체의 전체 수명 (생성 된 위치 및 전송 된 모든 유지 / 해제 메시지와 관련하여)에 매우 세심한주의를 기울이십시오. 이것은 이러한 성격의 버그를 추적하는 유일한 확실한 방법입니다. Instruments의 Zombies 도구에서 실행하는 동안 오류가 발생하도록합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다