OSX의 C ++ / Objective-C 응용 프로그램에서 드래그 작업 중 충돌이 발생합니다.

JohnT

일부 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

나는 아이디어가 없습니다. 어떤 도움을 주시면 감사하겠습니다.

Joshua Nozzi

이것은 코드의 메모리 관리 버그입니다. 두 번째 충돌 로그는 메시지 -member:에 응답하지 않는 객체 (NSNumber) 로 메시지 가 전송 되었음을 보여 주며 , 이는 메시지의 대상 이에 응답 하는 클래스 여야한다는 것을 강력하게 제안합니다 -member:. 이것이 당신 자신의 코드라고 확신 할 수있는 큰 단서입니다. 선을 따라 어딘가에서 이미 릴리스 된 후 개체에 메시지를 보내려고합니다. 끌린 물건을 어딘가에 보관하는 것을 잊었나요? (ARC 또는 가비지 컬렉션을 사용하지 않는 경우) 과다 릴리스했을 수 있습니까? 당신은 당신이 삭제하지 않은 매달린 참조가 있습니까? Dunno.

사용해야하는 도구는 Zombies 악기와 함께 악기입니다. 응용 프로그램을 실행하고 충돌 한 다음 Instruments에서 "좀비 개체에 메시지를 보냈습니다"지점에 플래그를 지정하도록합니다 (이 경우 계측기는 실제로 개체를 해제하지 않고 개체를 유지하고 "좀비"로 표시합니다. -언데드 오브젝트- 보유 수가 0에 도달 한 후 할당 해제 되어야 하는 오브젝트로 전송 된 메시지를 감시합니다 . 팝 오버 메시지의 화살표를 클릭하고 해당 개체의 전체 수명 (생성 된 위치 및 전송 된 모든 유지 / 해제 메시지와 관련하여)에 매우 세심한주의를 기울이십시오. 이것은 이러한 성격의 버그를 추적하는 유일한 확실한 방법입니다. Instruments의 Zombies 도구에서 실행하는 동안 오류가 발생하도록합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이진수를 십진수로 변환하는 C ++ 응용 프로그램에서 작업 중입니다.

분류에서Dev

char arr = "..."; C 프로그램에서 충돌이 발생합니다.

분류에서Dev

응용 프로그램이 닫히지 않은 경우 (백그라운드에서 실행 중) 응용 프로그램 충돌이 발생합니까?

분류에서Dev

DataPoint 배열에 값을 추가하면 실행 중 응용 프로그램 충돌이 발생합니다.

분류에서Dev

IntentService의 데이터베이스 작업으로 인해 응용 프로그램이 중단되고 응답하지 않고 ANR이 발생합니다.

분류에서Dev

C 프로그램에서 충돌 유형 오류가 발생합니다.

분류에서Dev

iOS (Objective-C). 배열에서 블록을 가져올 때 응용 프로그램 충돌

분류에서Dev

시작시 내 응용 프로그램이 충돌합니다.

분류에서Dev

카운터가 루프 내에서 사용되면 C ++ 프로그램이 충돌합니다.

분류에서Dev

libvlc가 스트리밍을 중지 할 수 없으며 Qt 응용 프로그램에서 충돌이 발생합니다.

분류에서Dev

C 프로그램이 Seg Fault와 충돌하지만 LLDB에서 완벽하게 작동합니다.

분류에서Dev

다중 스레드 응용 프로그램에서 RichTextBox에 액세스하면 OutOfMemoryException이 발생합니다.

분류에서Dev

C # : Random.NextDouble 메서드가 응용 프로그램을 중단합니다.

분류에서Dev

extern DLL을 사용하여 네트워크 공유에서 .NET 응용 프로그램을 시작하면 충돌이 발생합니다.

분류에서Dev

내 C # 응용 프로그램이 localhost에서 실행될 때 간헐적으로 중단됩니다.

분류에서Dev

무작위 변수를 사용하면 C 프로그램이 충돌합니다.

분류에서Dev

C hello world 프로그램이 변수 출력에서 충돌합니다.

분류에서Dev

C ++ Windows OS에서 파일 생성 날짜를 얻는 방법이 내 콘솔 응용 프로그램을 충돌시킵니다.

분류에서Dev

작업자 스레드가 Using Block C # Windows 양식 응용 프로그램에 도달하면 실행을 중지합니다.

분류에서Dev

전역 마우스 후크로 인해 응용 프로그램 충돌이 발생 함 (C ++ / Windows7)

분류에서Dev

작업 스케줄러와 함께 작동하는 내 응용 프로그램이 내 C # 코드에서 디렉터리를 만들 수 없습니다.

분류에서Dev

작업 스케줄러와 함께 작동하는 내 응용 프로그램이 내 C # 코드에서 디렉터리를 만들 수 없습니다.

분류에서Dev

C # 응용 프로그램이 2012와 비교하지 않고 PC에서 작동 중지

분류에서Dev

C # 응용 프로그램이 2012와 비교하지 않고 PC에서 작동 중지

분류에서Dev

백그라운드 작업자를 사용한 후에도 내 응용 프로그램이 중단됩니다.

분류에서Dev

C ++의 연결 목록에 새 노드를 추가하는 동안 프로그램이 충돌합니다.

분류에서Dev

Windows 7의 작업 표시 줄에서 실행중인 응용 프로그램 및 고정 된 응용 프로그램 아이콘이 없음

분류에서Dev

Windows에서 C # tcp 프로토콜 연결. 서버 응용 프로그램이 충돌하면 어떻게됩니까?

분류에서Dev

스크립트에서 시작된 응용 프로그램에서 Ctrl + C를 누르면 스크립트가 중단되는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    이진수를 십진수로 변환하는 C ++ 응용 프로그램에서 작업 중입니다.

  2. 2

    char arr = "..."; C 프로그램에서 충돌이 발생합니다.

  3. 3

    응용 프로그램이 닫히지 않은 경우 (백그라운드에서 실행 중) 응용 프로그램 충돌이 발생합니까?

  4. 4

    DataPoint 배열에 값을 추가하면 실행 중 응용 프로그램 충돌이 발생합니다.

  5. 5

    IntentService의 데이터베이스 작업으로 인해 응용 프로그램이 중단되고 응답하지 않고 ANR이 발생합니다.

  6. 6

    C 프로그램에서 충돌 유형 오류가 발생합니다.

  7. 7

    iOS (Objective-C). 배열에서 블록을 가져올 때 응용 프로그램 충돌

  8. 8

    시작시 내 응용 프로그램이 충돌합니다.

  9. 9

    카운터가 루프 내에서 사용되면 C ++ 프로그램이 충돌합니다.

  10. 10

    libvlc가 스트리밍을 중지 할 수 없으며 Qt 응용 프로그램에서 충돌이 발생합니다.

  11. 11

    C 프로그램이 Seg Fault와 충돌하지만 LLDB에서 완벽하게 작동합니다.

  12. 12

    다중 스레드 응용 프로그램에서 RichTextBox에 액세스하면 OutOfMemoryException이 발생합니다.

  13. 13

    C # : Random.NextDouble 메서드가 응용 프로그램을 중단합니다.

  14. 14

    extern DLL을 사용하여 네트워크 공유에서 .NET 응용 프로그램을 시작하면 충돌이 발생합니다.

  15. 15

    내 C # 응용 프로그램이 localhost에서 실행될 때 간헐적으로 중단됩니다.

  16. 16

    무작위 변수를 사용하면 C 프로그램이 충돌합니다.

  17. 17

    C hello world 프로그램이 변수 출력에서 충돌합니다.

  18. 18

    C ++ Windows OS에서 파일 생성 날짜를 얻는 방법이 내 콘솔 응용 프로그램을 충돌시킵니다.

  19. 19

    작업자 스레드가 Using Block C # Windows 양식 응용 프로그램에 도달하면 실행을 중지합니다.

  20. 20

    전역 마우스 후크로 인해 응용 프로그램 충돌이 발생 함 (C ++ / Windows7)

  21. 21

    작업 스케줄러와 함께 작동하는 내 응용 프로그램이 내 C # 코드에서 디렉터리를 만들 수 없습니다.

  22. 22

    작업 스케줄러와 함께 작동하는 내 응용 프로그램이 내 C # 코드에서 디렉터리를 만들 수 없습니다.

  23. 23

    C # 응용 프로그램이 2012와 비교하지 않고 PC에서 작동 중지

  24. 24

    C # 응용 프로그램이 2012와 비교하지 않고 PC에서 작동 중지

  25. 25

    백그라운드 작업자를 사용한 후에도 내 응용 프로그램이 중단됩니다.

  26. 26

    C ++의 연결 목록에 새 노드를 추가하는 동안 프로그램이 충돌합니다.

  27. 27

    Windows 7의 작업 표시 줄에서 실행중인 응용 프로그램 및 고정 된 응용 프로그램 아이콘이 없음

  28. 28

    Windows에서 C # tcp 프로토콜 연결. 서버 응용 프로그램이 충돌하면 어떻게됩니까?

  29. 29

    스크립트에서 시작된 응용 프로그램에서 Ctrl + C를 누르면 스크립트가 중단되는 이유는 무엇입니까?

뜨겁다태그

보관