[ios] EXC_BAD_ACCESS 신호 수신

응용 프로그램을 장치에 배포하면 몇 번의주기 후에 프로그램이 다음 오류와 함께 종료됩니다.

Program received signal: "EXC_BAD_ACCESS".

이 프로그램은 iPhone 시뮬레이터에서 아무런 문제없이 실행되며 한 번에 하나씩 지침을 단계별로 실행하는 한 디버그 및 실행됩니다. 다시 실행하자마자 EXC_BAD_ACCESS신호를칩니다.

이 특별한 경우에는 가속도계 코드에서 오류가 발생했습니다. 시뮬레이터 내에서 실행되지 않으므로 오류가 발생하지 않습니다. 그러나 일단 장치에 배포되면 실행됩니다.

이 질문에 대한 대부분의 답변은 일반적인 EXC_BAD_ACCESS오류를 다루 므로 무시 무시한 Bad Access 오류에 대한 포괄적 인 정보로 열어 두겠습니다.

EXC_BAD_ACCESS일반적으로 잘못된 메모리 액세스의 결과로 발생합니다. 자세한 내용은 아래 답변을 참조하십시오.

EXC_BAD_ACCESS이전에 그 신호 를 만났 습니까? 어떻게 처리 했습니까?



답변

귀하의 설명에서 가장 가능성이 높은 설명은 메모리 관리에 약간의 오류가 있다고 생각합니다. 당신은 몇 주 동안 iPhone 개발 작업을 해왔지만 일반적으로 Objective C에 경험이 있는지 여부는 아닙니다. 다른 배경을 가지고 있다면 메모리 관리 규칙을 실제로 내부화하기 전에 약간의 시간이 걸릴 수 있습니다.

할당 함수 (일반적으로 정적 할당 방법이지만 몇 가지 다른 것) 또는 복사 방법에서 얻은 것은 메모리도 소유하고 있으며 완료되면 해제해야합니다.

그러나 팩토리 메소드 (예 :)를 포함하여 다른 것에서 무언가를 얻는다면 자동 [NSString stringWithFormat]릴리스 참조를 갖게 될 것입니다. 즉, 다른 코드로 나중에 언젠가 릴리스 될 수 있다는 것을 의미합니다. 즉시 유지하는 기능 이상으로 유지하십시오. 그렇지 않으면 에뮬레이터 테스트 중에 메모리를 사용하는 동안 메모리가 할당 된 상태로 유지되거나 해제되었지만 우연히 여전히 유효하지만 장치에서 실행될 때 해제되어 잘못된 액세스 오류로 표시 될 수 있습니다.

이러한 것들을 추적하는 가장 좋은 방법은 어쨌든 명백한 문제가 없더라도 좋은 아이디어는 인스트루먼트 도구에서, 특히 누출 옵션을 사용하여 앱을 실행하는 것입니다.


답변

EXC_BAD_ACCESS의 주요 원인은 해제 된 개체에 액세스하려고하기 때문입니다.

이 문제를 해결하는 방법을 알아 보려면 다음 문서를 읽으십시오.
DebuggingAutoReleasePool

“자동 해제 된 객체 해제”를 생각하지 않더라도 적용됩니다.

이 방법은 매우 효과적입니다. 나는 항상 큰 성공으로 그것을 사용합니다 !!

요약하면, 이것은 Cocoa의 NSZombie 디버깅 클래스와 명령 줄 “malloc_history”도구를 사용하여 코드에서 어떤 릴리스 된 객체에 액세스했는지 정확하게 설명합니다.

각주 :

계측기를 실행하고 누출을 검사해도 EXC_BAD_ACCESS 문제를 해결하는 데 도움이되지 않습니다. 메모리 누수가 EXC_BAD_ACCESS와 아무 관련이 없다고 확신합니다. 누수의 정의는 더 이상 액세스 할 수없는 개체이므로 호출 할 수 없습니다.

업데이트 :
이제 계측기를 사용하여 누출을 디버깅합니다. Xcode 4.2에서 Product-> Profile을 선택하고 Instruments가 시작되면 “Zombies”를 선택하십시오.


답변

EXC_BAD_ACCESS 신호는 시스템 호출에 유효하지 않은 포인터를 전달한 결과입니다. OS X에서 테스트 프로그램으로 오늘 일찍 하나를 얻었습니다. 초기화되지 않은 변수를 전달했습니다.pthread_join() .

iPhone 개발에 익숙하지는 않지만 시스템 호출에 전달하는 모든 버퍼 포인터를 다시 확인해야합니다. 컴파일러의 경고 수준을 완전히 높이십시오 (gcc로 -Wall-Wextra옵션 사용). 시뮬레이터 / 디버거에서 가능한 한 많은 진단을 활성화하십시오.


답변

내 경험상 이것은 일반적으로 잘못된 메모리 액세스로 인해 발생합니다. 모든 포인터, 특히 객체 포인터가 초기화되어 있는지 확인하십시오. MainWindow.xib 파일을 사용하는 경우 필요한 모든 연결로 올바르게 설정되어 있는지 확인하십시오.

종이 검사 중 아무것도 켜지지 않고 단일 스테핑시 발생하지 않는 경우 NSLog () 문으로 오류를 찾으십시오. 오류. 그런 다음 해당 줄에 중단 점을 설정하고 프로그램을 실행하십시오. 중단 점에 도달하면 모든 변수와 그 안에있는 객체를 검사하여 예상치 않은 것이 있는지 확인하십시오. 특히 객체 클래스가 예상치 못한 변수를 주시하십시오. 변수에 UIWindow가 포함되어 있지만 NSNotification이있는 경우 디버거가 작동하지 않을 때 동일한 기본 코드 오류가 다른 방식으로 나타날 수 있습니다.


답변

방금 EXC_BAD_ACCESS를 추적하는 데 몇 시간을 보냈으며 NSZombies 및 기타 환경 변수가 아무 것도 말하지 않는 것으로 나타났습니다.

나에게는 형식 지정자가 있지만 바보가 전달되지 않은 바보 같은 NSLog 문이었습니다.

NSLog(@"Some silly log message %@-%@");

에 의해 고정

NSLog(@"Some silly log message %@-%@", someObj1, someObj2);


답변

2010 WWDC 비디오는 Apple 개발자 프로그램의 모든 참가자가 사용할 수 있습니다. “세션 311-인스트루먼트를 사용한 고급 메모리 분석”은 인스트루먼트에서 좀비를 사용하고 다른 메모리 문제를 디버깅하는 예제를 보여줍니다.

로그인 페이지에 대한 링크를 보려면 여기를 클릭하십시오 .


답변

완전한 대답은 아니지만이를받은 특정 상황은 자동 릴리스를 사용하려고 시도하여 ‘죽은’객체에 액세스하려고 할 때입니다.

netObjectDefinedInMyHeader = [[[MyNetObject alloc] init] autorelease];

예를 들어, 실제로 이것을 ‘알림’하기 위해 객체로 전달하고 (원하는대로 관객, 관찰자 ​​등으로 등록) 알림이 전송되면 이미 사망했으며 EXC_BAD_ACCESS를 얻습니다. [[MyNetObject alloc] init]적절하게 변경하고 나중에 해제하면 오류가 해결되었습니다.

이 문제가 발생할 수있는 또 다른 이유는 예를 들어 객체를 전달하여 저장하려고하는 경우입니다.

myObjectDefinedInHeader = aParameterObjectPassedIn;

나중에 myObjectDefinedInHeader에 액세스하려고하면 문제가 발생할 수 있습니다. 사용 :

myObjectDefinedInHeader = [aParameterObjectPassedIn retain];

필요한 것일 수도 있습니다. 물론 이것들은 내가 겪은 것에 대한 몇 가지 예일 뿐이며 다른 이유가 있지만, 이것들은 애매하게 보일 수 있으므로 언급 할 수 있습니다. 행운을 빕니다!