ما الذي يسبب الخطأ "EXC_BAD_ACCESS" عند الحصول على معلومات wifi؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

أتلقى الخطأ التالي

إشارة استقبال البرنامج:"EXC_BAD_ACCESS".
تحذير:check_safe_call:لا يمكن استعادة الإطار الحالي

تحذير:غير قادر على استعادة الإطار المحدد مسبقًا.
تحذير:غير قادر على استعادة الإطار المحدد مسبقًا.

تطبيقي هو الحصول على معلومات wifi

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% من أن هذا موجود فقط في رمز التصحيح الخاص بك وليس في رمز التوزيع الخاص بك.نظرًا لأنه لم يتم إصدار أي شيء على الإطلاق، فسوف يتسرب تطبيقك ويتسرب ويتسرب.لتذكيري بالقيام بذلك، قمت بوضع هذا السجل في تطبيقي:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");

إذا كنت بحاجة إلى مساعدة في العثور على السطر المحدد، فقم بإجراء البناء والتصحيح (CMD-Y) بدلاً من البناء والتشغيل (CMD-R).عندما يتعطل التطبيق، سيُظهر لك مصحح الأخطاء الخط المحدد وبالاشتراك مع NSZombieEnabled، يجب أن تكون قادرًا على معرفة السبب بالضبط.

نصائح أخرى

يحدث exc_bad_Access دائما عند الوصول إلى الذاكرة التي أصدرتها بالفعل. في التعليمات البرمجية الخاصة بك، لا أستطيع أن أرى أين airportHandle تتم تهيئته، أو باهتة يتم تهيئته على الإطلاق لهذه المسألة.

إذا تمت تهيئته لكنك نسيت فقط نشر هذا الرمز، فيجب أن تحاول التحقق من ذلك ما إذا كنت قد تحركت مع المقبض في مكان ما.

لتصحيح مثل هذا الانتهاك في الوصول، فغالبا ما يكون مفيدا لتعيين NSZombieEnabled علم البيئة YES. وبعد سيؤدي ذلك إلى تشغيل وقت تشغيل OBJ-C للحصول على الذاكرة التي تم إصدارها إلى وحدة التحكم. يمكنك أن تجد تعليمي كامل حول كيفية استخدام هذه المعلومات مع الأدوات للعثور على مشكلتك.

يمكنك القيام بذلك بسهولة مع الأدوات: راجع هذا المنشور الرائع حقا:

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

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. ما يعادله في إطار MobileWiFi، وهو ل SDK 3.x و 4.x، هو /System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager بدلاً من /System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top