Wi -Fi 정보를 얻을 때 "exc_bad_access"오류의 원인은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1727417

  •  19-09-2019
  •  | 
  •  

문제

다음 오류가 발생합니다

프로그램 수신 신호 :“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 런타임이 콘솔에 릴리스 메모리에 대한 로그 액세스가 발생합니다. 당신은 찾을 수 있습니다 전체 튜토리얼 해당 정보를 도구와 함께 사용하여 문제를 찾는 방법에 대해.

당신은 악기로 쉽게 할 수 있습니다 : 정말 훌륭한 게시물을 참조하십시오.

http://www.corbinstreehouse.com/blog/2007/10/instruments-on-leopard-how-to-debug-random-random-crashes-in-your-cocoa-app/comment-page-1/#comment -43762

exc_bad_access. 미래에 더 필요한 객체를 공개했을 때 주로 발견됩니다. 찾을 수는 없지만 디버그 모드에 있어야한다는 솔루션이 있습니다. 그런 다음 다음 링크를 따르십시오

http://www.codza.com/how-to-debug-exc_bad_access-on-iphone

이것은 진짜 작동한다

나는 같은 일을하고 있으며 같은 문제를 겪고 있습니다. 디버그 모드를 입력하면 사용될 때 확인할 수 있습니다. open = dlsym(libHandle, "Apple80211Open"); 함수는 여전히 0과 같습니다.

그래서 제 생각에는 당신은 Apple80211Open 이 기능을 포함하지 않은 프레임 워크에서.

Apple80211OpenApple80211 > iOS 2.X SDK에서 오래된 개인 프레임 워크. 3.x 및 4.x sdk의 Mobilewifi 프레임 워크에서 동등한 것은 다음과 같습니다. /System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager 대신에 /System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top