Wi -Fi 정보를 얻을 때 "exc_bad_access"오류의 원인은 무엇입니까?
문제
다음 오류가 발생합니다
프로그램 수신 신호 :“exc_bad_access”.
경고 : check_safe_call : 현재 프레임을 복원 할 수 없습니다경고 : 이전에 선택한 프레임을 복원 할 수 없습니다.
경고 : 이전에 선택한 프레임을 복원 할 수 없습니다.
내 앱은 Wi -Fi 정보를 얻는 것입니다
libHandle = dlopen("/System/Library/PrivateFrameworks/ MobileWiFi.framework/MobileWiFi",RTLD_LAZY);
open = dlsym(libHandle, "Apple80211Open");
bind = dlsym(libHandle, "Apple80211BindToInterface");
close = dlsym(libHandle, "Apple80211Close");
scan = dlsym(libHandle, "Apple80211Scan");
open(&airportHandle);
bind(airportHandle, @"en0");
코드가 도달하면 open(&airportHandle)
, 나는 오류를 받지만이 줄에서는 그것이 멈추기 때문에 확실하지 않습니다.
이것을 어떻게 해결할 수 있습니까?
해결책
exc_bad_access 오류의 경우 일반적으로 릴리스 객체에 메시지를 보내려고합니다. 그만큼 베스트 이것들을 추적하는 방법은 사용됩니다 nszombieenabled.
이것은 실제로 객체를 풀어주지 않지만 "좀비"로 마무리하고 그 안에 깃발을 설정하여 일반적으로 출시되었을 것입니다. 이런 식으로 다시 액세스하려고하면 오류를 만들기 전에 그것이 무엇인지 여전히 알고 있으며이 작은 정보를 사용하면 일반적으로 문제가 무엇인지 확인할 수 있습니다.
디버거가 때때로 유용한 정보를 얻을 때 특히 백그라운드 스레드에 도움이됩니다.
주목하는 것이 매우 중요합니다 그러나 100% 배포 코드가 아닌 디버그 코드에만 있는지 확인해야합니다. 아무것도 해제되지 않기 때문에 앱이 누출되고 누출되고 누출됩니다. 이 작업을 상기시키기 위해이 로그인을 AppDelegate에 넣었습니다.
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
정확한 라인을 찾는 데 도움이 필요한 경우 빌드 앤 런 (CMD-R) 대신 빌드 앤 데그 (CMD-Y)를 수행하십시오. 앱이 충돌하면 디버거가 NSZombieEnabled와 함께 정확히 어떤 라인을 표시하고, 정확히 이유를 찾을 수 있어야합니다.
다른 팁
exc_bad_access는 이미 공개 한 메모리에 액세스 할 때 항상 발생합니다. 샘플 코드에서 어디에 있는지 알 수 없습니다 airportHandle
초기화되거나 wheter는 해당 문제에 대해 전혀 초기화됩니다.
초기화되었지만 해당 코드를 게시하는 것을 잊어 버린 경우 핸들을 어딘가에 공개했는지 확인해야합니다.
그러한 액세스 위반을 디버깅하려면 종종 NSZombieEnabled
환경 깃발 YES
. 이로 인해 OBJ-C 런타임이 콘솔에 릴리스 메모리에 대한 로그 액세스가 발생합니다. 당신은 찾을 수 있습니다 전체 튜토리얼 해당 정보를 도구와 함께 사용하여 문제를 찾는 방법에 대해.
당신은 악기로 쉽게 할 수 있습니다 : 정말 훌륭한 게시물을 참조하십시오.
exc_bad_access. 미래에 더 필요한 객체를 공개했을 때 주로 발견됩니다. 찾을 수는 없지만 디버그 모드에 있어야한다는 솔루션이 있습니다. 그런 다음 다음 링크를 따르십시오
http://www.codza.com/how-to-debug-exc_bad_access-on-iphone
이것은 진짜 작동한다
나는 같은 일을하고 있으며 같은 문제를 겪고 있습니다. 디버그 모드를 입력하면 사용될 때 확인할 수 있습니다. open = dlsym(libHandle, "Apple80211Open");
함수는 여전히 0과 같습니다.
그래서 제 생각에는 당신은 Apple80211Open
이 기능을 포함하지 않은 프레임 워크에서.
Apple80211Open
에 Apple80211
> iOS 2.X SDK에서 오래된 개인 프레임 워크. 3.x 및 4.x sdk의 Mobilewifi 프레임 워크에서 동등한 것은 다음과 같습니다. /System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager
대신에 /System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi