2014-06-24 2 views
1

Xcode 5.1.1을 사용하여 Mac OS (10.8.4) 앱을 작성했습니다 (막히면 카드 여덟 가지 게임을 해결할 수 있습니다) 효율성이나 메모리 사용에 신경을 쓰지 마라. 재귀 프로그램 (가능한 이동, 재귀, 다음 이동 생성 등의 트리를 생성합니다.) 때문에 많은 메모리가 필요합니다 (24 GB가 있음) 스택을 증가 시켰습니다 (-Wl, - stack_size, 0x4000000). 그러나,에 관계없이 스택 크기의, 나는 같은 깊이 (약 170 수준)에서 항상 EXC_BAD_ACCESS 코드 = 2를 얻을, 그것은있는 NSString stringWithFormat을 사용하는 줄에 항상 : 같은 : 라인이있다깊은 NSString 문자열에 대한 EXC_BAD_ACCESS stringWithFormat :

NSString *temp = [NSString stringWithFormat:@"%d",value]; // value is an integer 

이전 모든 재귀 수준에서 정상적으로 실행되었습니다. 특정 줄을 제거하면 다른 stringWithFormat 줄에서 예외가 발생합니다. 마치 스택 크기 설정에 관계없이 NSString에 자체 제한이있는 것과 같습니다. ARC 대신 가비지 수집을 사용할 때 이전에 작동했습니다. (Xcode에서 ARC로 변환하길 원했습니다.)

좀비를 확인했지만 오류 줄에서 참조되는 개체가 없습니다.

왜 스택 크기에 관계없이 EXC_BAD_ACCESS를 가져올 수 있으며 항상 stringWithFormat :?에 있습니까?

추가 충돌 로그 :

Process:   EightOff Solver [11701] 
Path:   /Users/USER/Library/Developer/Xcode/DerivedData/EightOff_Solver-dqppnsumvcsujjflailrgqxogyij/Build/Products/Debug/EightOff Solver.app/Contents/MacOS/EightOff Solver 
Identifier:  com.yourcompany.EightOff_Solver 
Version:   1.0 
Code Type:  X86-64 (Native) 
Parent Process: launchd [179] 
User ID:   501 

Date/Time:  2014-06-25 01:38:46.581 -0500 
OS Version:  Mac OS X 10.8.4 (12E55) 
Report Version: 10 
Sleep/Wake UUID: 561695D4-0498-43DC-9B0E-9417A5D5120D 

Interval Since Last Report:   60266 sec 
Crashes Since Last Report:   2 
Per-App Crashes Since Last Report: 9 
Anonymous UUID:      96F16B3C-9A73-63C2-B5CD-11CC51CFE612 

Crashed Thread: 1 Dispatch queue: com.apple.root.default-priority 

Exception Type: EXC_BAD_ACCESS (SIGBUS) 
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000100400ec8 

VM Regions Near 0x100400ec8: 
    MALLOC_TINY   0000000100100000-0000000100400000 [ 3072K] rw-/rwx SM=PRV 
--> STACK GUARD   0000000100400000-0000000100401000 [ 4K] ---/rwx SM=NUL stack guard for thread 1 
    Stack     0000000100401000-0000000100483000 [ 520K] rw-/rwx SM=COW thread 1 

Thread 0:: Dispatch queue: com.apple.main-thread 
0 libsystem_kernel.dylib   0x00007fff8eb18686 mach_msg_trap + 10 
1 libsystem_kernel.dylib   0x00007fff8eb17c42 mach_msg + 70 
2 com.apple.CoreFoundation  0x00007fff93d38233 __CFRunLoopServiceMachPort + 195 
3 com.apple.CoreFoundation  0x00007fff93d3d916 __CFRunLoopRun + 1078 
4 com.apple.CoreFoundation  0x00007fff93d3d0e2 CFRunLoopRunSpecific + 290 
5 com.apple.HIToolbox    0x00007fff93a36eb4 RunCurrentEventLoopInMode + 209 
6 com.apple.HIToolbox    0x00007fff93a36c52 ReceiveNextEventCommon + 356 
7 com.apple.HIToolbox    0x00007fff93a36ae3 BlockUntilNextEventMatchingListInMode + 62 
8 com.apple.AppKit    0x00007fff9a52a533 _DPSNextEvent + 685 
9 com.apple.AppKit    0x00007fff9a529df2 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128 
10 com.apple.AppKit    0x00007fff9a5211a3 -[NSApplication run] + 517 
11 com.apple.AppKit    0x00007fff9a4c5bd6 NSApplicationMain + 869 
12 com.yourcompany.EightOff_Solver 0x0000000100006ea2 main + 34 (main.m:13) 
13 com.yourcompany.EightOff_Solver 0x0000000100001bc4 start + 52 

Thread 1 Crashed:: Dispatch queue: com.apple.root.default-priority 
0 libsystem_c.dylib    0x00007fff936c682d __vfprintf + 40 
1 libsystem_c.dylib    0x00007fff936c4e16 vsnprintf_l + 254 
2 libsystem_c.dylib    0x00007fff936bf462 snprintf_l + 127 
3 com.apple.CoreFoundation  0x00007fff93d0ef3f __CFStringAppendFormatCore + 11199 
4 com.apple.CoreFoundation  0x00007fff93d594fb _CFStringCreateWithFormatAndArgumentsAux + 107 
5 com.apple.Foundation   0x00007fff9a03f13c +[NSString stringWithFormat:] + 170 
6 com.yourcompany.EightOff_Solver 0x0000000100009b67 -[Card description] + 663 (Card.m:265) 
7 com.yourcompany.EightOff_Solver 0x00000001000091f7 -[Card makeNewGameStates:] + 9031 (Card.m:211) 
8 com.yourcompany.EightOff_Solver 0x0000000100005087 -[MyDocument recursiveOnGameState:depth:] + 6903 (MyDocument.m:1195) 
9 com.yourcompany.EightOff_Solver 0x00000001000054b2 -[MyDocument recursiveOnGameState:depth:] + 7970 (MyDocument.m:1210) 
10 com.yourcompany.EightOff_Solver 0x00000001000054b2 -[MyDocument recursiveOnGameState:depth:] + 7970 (MyDocument.m:1210) 

... [deleted identical lines numbered 11 through 170] 

171 com.yourcompany.EightOff_Solver 0x00000001000054b2 -[MyDocument recursiveOnGameState:depth:] + 7970 (MyDocument.m:1210) 
172 com.yourcompany.EightOff_Solver 0x00000001000054b2 -[MyDocument recursiveOnGameState:depth:] + 7970 (MyDocument.m:1210) 
173 com.yourcompany.EightOff_Solver 0x00000001000054b2 -[MyDocument recursiveOnGameState:depth:] + 7970 (MyDocument.m:1210) 
174 com.yourcompany.EightOff_Solver 0x00000001000054b2 -[MyDocument recursiveOnGameState:depth:] + 7970 (MyDocument.m:1210) 
175 com.yourcompany.EightOff_Solver 0x00000001000054b2 -[MyDocument recursiveOnGameState:depth:] + 7970 (MyDocument.m:1210) 
176 com.yourcompany.EightOff_Solver 0x00000001000054b2 -[MyDocument recursiveOnGameState:depth:] + 7970 (MyDocument.m:1210) 
177 com.yourcompany.EightOff_Solver 0x00000001000029c2 -[MyDocument startBackgroundThread] + 2706 (MyDocument.m:882) 
178 com.apple.CoreFoundation  0x00007fff93d8f09c __invoking___ + 140 
179 com.apple.CoreFoundation  0x00007fff93d8ef37 -[NSInvocation invoke] + 263 
180 com.apple.Foundation   0x00007fff9a07da30 -[NSInvocationOperation main] + 34 
181 com.apple.Foundation   0x00007fff9a075926 -[__NSOperationInternal start] + 684 
182 com.apple.Foundation   0x00007fff9a07d0f1 __block_global_6 + 129 
183 libdispatch.dylib    0x00007fff96ec4f01 _dispatch_call_block_and_release + 15 
184 libdispatch.dylib    0x00007fff96ec10b6 _dispatch_client_callout + 8 
185 libdispatch.dylib    0x00007fff96ec21fa _dispatch_worker_thread2 + 304 
186 libsystem_c.dylib    0x00007fff93654d0b _pthread_wqthread + 404 
187 libsystem_c.dylib    0x00007fff9363f1d1 start_wqthread + 13 

Thread 2:: Dispatch queue: com.apple.libdispatch-manager 
0 libsystem_kernel.dylib   0x00007fff8eb1ad16 kevent + 10 
1 libdispatch.dylib    0x00007fff96ec3dea _dispatch_mgr_invoke + 883 
2 libdispatch.dylib    0x00007fff96ec39ee _dispatch_mgr_thread + 54 

Thread 3: 
0 libsystem_kernel.dylib   0x00007fff8eb1a6d6 __workq_kernreturn + 10 
1 libsystem_c.dylib    0x00007fff93654f4c _pthread_workq_return + 25 
2 libsystem_c.dylib    0x00007fff93654d13 _pthread_wqthread + 412 
3 libsystem_c.dylib    0x00007fff9363f1d1 start_wqthread + 13 

Thread 4: 
0 libsystem_kernel.dylib   0x00007fff8eb1a6d6 __workq_kernreturn + 10 
1 libsystem_c.dylib    0x00007fff93654f4c _pthread_workq_return + 25 
2 libsystem_c.dylib    0x00007fff93654d13 _pthread_wqthread + 412 
3 libsystem_c.dylib    0x00007fff9363f1d1 start_wqthread + 13 

Thread 5: 
0 libsystem_kernel.dylib   0x00007fff8eb1a6d6 __workq_kernreturn + 10 
1 libsystem_c.dylib    0x00007fff93654f4c _pthread_workq_return + 25 
2 libsystem_c.dylib    0x00007fff93654d13 _pthread_wqthread + 412 
3 libsystem_c.dylib    0x00007fff9363f1d1 start_wqthread + 13 

Thread 6: 
0 libsystem_kernel.dylib   0x00007fff8eb1a6d6 __workq_kernreturn + 10 
1 libsystem_c.dylib    0x00007fff93654f4c _pthread_workq_return + 25 
2 libsystem_c.dylib    0x00007fff93654d13 _pthread_wqthread + 412 
3 libsystem_c.dylib    0x00007fff9363f1d1 start_wqthread + 13 

Thread 1 crashed with X86 Thread State (64-bit): 
    rax: 0x0000000000000208 rbx: 0x00007fff7ecb5a98 rcx: 0x00000001004014c0 rdx: 0x0000000100402d30 
    rdi: 0x0000000100401338 rsi: 0x00007fff7ecb5a98 rbp: 0x0000000100401250 rsp: 0x0000000100400e20 
    r8: 0x00000001004014c0 r9: 0x0000000000000003 r10: 0x0000000000000000 r11: 0x00000001004012b4 
    r12: 0x00000000000001ff r13: 0x0000000100401500 r14: 0x00000001004014c0 r15: 0x0000000100402d30 
    rip: 0x00007fff936c682d rfl: 0x0000000000010202 cr2: 0x0000000100400ec8 
Logical CPU: 0 

6/30/14 편집은 추가 :이는 내가 5.1.1 엑스 코드를 업그레이드 할 때 (5.0) 발생하기 시작했다. 변경된 빌드 설정 때문일 수 있습니까? (나는 그들이 전에 있었는지 모르겠다.) iMac (늦은 2012 년) 인텔 코어 i5, OS 10.8.4를 사용하고 있습니다. 일부 설정은 다음과 같습니다. Base SDK : Latest (10.8로 제한 시도했습니다); 유효한 아키텍처 i386, x86_64 (i386 또는 x86_64 만 사용해 보았습니다.) 배포 대상 : 10.8.

7/1/14 편집 추가 : (UI 작업의 기본 대기열에 dispatch_async와 함께) NSOperationQueue를 사용하고있었습니다. NSOperationQueue를 제거하면 충돌이 해결되었지만 지금은 UI를 업데이트 할 수 없습니다 (NSLog는 출력을 제공함). 백그라운드 대기열을 사용하여 dispatch_async()에서 내 루프를 실행하면 충돌이 발생하고 UI가 업데이트되지 않습니다. 분명히 백그라운드 작업은 변경할 수없는 NSString과 관련된 리소스 제한이 있습니다. 내 UI를 업데이트하지 않더라도 충돌이 발생합니다 (항상 NSString을 생성 할 때).

+0

전체 스택 추적을 게시하십시오. – trojanfoe

+0

대부분의 경우 일부 메모리를 덮어 쓰며 결과적으로 어딘가에 메모리 할당이 실패합니다. 소스 코드와 특히 C 배열에 쓰는 곳을 확인하십시오. – gnasher729

+0

코드를 더 많이 보여야합니다. – trojanfoe

답변

0

dispatch_async()를 제거하고 주 스레드에서이를 실행하여 문제가 해결되었다는 사실은 실제로 스레드의 스택 메모리가 부족하다고 생각하게 만듭니다. 나는 방금 비슷한 문제 (EXC_BAD_ACCESS 함수를 깊이 재귀 집합에서 다양한 함수의 맨)에 만났고 스택 크기를 늘려서 문제를 해결할 수있었습니다. 나는 -Wl, -stack_size, ... 플래그를 사용하거나 NSThreads를 사용하여 크기를 늘릴 수 없었습니다. (아마도 그것이 도움이되지 않는 이유입니다.) 대신 pthread_create()를 사용하여 스레드를 시작했으며, 먼저 pthread_attr_setstacksize()를 호출했습니다. 다음은 코드 예제입니다. https://developer.apple.com/library/content/qa/qa1419/_index.html

관련 문제