2


0

Wi-Fi情報を取得するときに「EXC_BAD_ACCESS」エラーが発生する原因は何ですか?

次のようなエラーが出ます

_ _ プログラム受信信号:「EXC_BAD_ACCESS」。 警告:check_safe_call:現在のフレームを復元できませんでした

警告:前に選択したフレームを元に戻すことができません。 警告:前に選択したフレームを元に戻すことができません。 _ _

私のアプリは無線LAN情報を取得することです

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()に達すると(

どうすればこれを解決できますか?

5 Answer


6


EXC_BAD_ACCESSエラーが発生した場合は、通常、解放されたオブジェクトにメッセージを送信しようとしています。 これらを追跡する* BEST *方法は NSZombieEnabledを使うことです。

これは実際にはオブジェクトを解放するのではなく、「ゾンビ」としてそれを包み込み、その中に通常は解放されているというフラグを立てることで機能します。 こうすれば、再度アクセスしようとしても、エラーが発生する前の状態を把握しています。このわずかな情報で、通常は問題の原因を突き止めることができます。

デバッガが有用な情報を見つけ出すときに、バックグラウンドスレッドで特に役立ちます。

*注意すること*非常に重要*ただし、これはデバッグコードにのみ含まれ、配布コードには含まれていないことを100%確認する必要があるということです。 何もリリースされていないので、あなたのアプリはリークしてリークしてリークします。 これをするように私に思い出させるために、私は私のappdelegateにこのログを入れます:

if(getenv( "NSZombieEnabled")|| getenv( "NSAutoreleaseFreedObjectCheckEnabled"))NSLog(@ "NSZombieEnabled / NSAutoreleaseFreedObjectCheckEnabledが有効です");

正確な行を見つける手助けが必要な場合は、ビルドアンド実行(CMD-R)の代わりにビルドアンドデバッグ(CMD-Y)を行ってください。 アプリがクラッシュすると、デバッガはどの行をNSZombieEnabledと組み合わせて正確に表示するか、正確な理由を見つけることができます。


1


すでに解放したメモリにアクセスすると、常にEXC_BAD_ACCESSが発生します。 あなたのサンプルコードでは、 `airportHandle`がどこで初期化されているのか、あるいはそのことに関してまったく初期化されているのであればわかりません。

初期化されているのにそのコードをポストするのを忘れた場合は、どこかでハンドルを離したかどうかを確認してください。

そのようなアクセス違反をデバッグするために、 NSZombieEnabled`環境フラグを YES`に設定することはしばしば役に立ちます。 これにより、Obj-Cランタイムは解放されたメモリへのアクセスをコンソールに記録します。 あなたは 完全チュートリアルを見つけることができますあなたの問題を見つけるためにInstrumentsと一緒にその情報を使う方法について。


0


あなたはそれを器械で簡単にすることができます:これを本当に素晴らしい記事を見てください:


0


EXC_BAD_ACCESS あなたが将来さらに必要としているオブジェクトをリリースしたときに主に見つかります。見つけることはできませんが、見つけるための解決策がありますuデバッグモードでなければならない。 その後、これらのリンクに従ってください

それは実際に動作します


0


私は同じことに取り組んでいます、そして私は同じ問題を受けます。 デバッグモードに入った場合、 `open = dlsym(libHandle、" Apple80211Open ");を使用すると、関数はまだ0に等しいことがわかります。

だから私の意見では、あなたはこの関数を含まないフレームワークの中で `Apple80211Open`を探しています。

Apple80211Open`は、iOS 2.x SDKで時代遅れになった Apple80211`プライベートフレームワークの中にあります。 3.xおよび4.x SDK用のMobileWifiフレームワークで同等のものは、/ System / Library / PrivateFrameworks / MobileWiFi.framework / MobileWiFiではなく/ System / Library / SystemConfiguration / WiFiManager.bundle / WiFiManagerです。 `