English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

طرق متابعة Crash في iOS بشكل عام وكيفية تعريف Bugly

طرق تتبع إصطدام iOS بشكل تقليدي وتطبيق Bugly

عندما يحدث إصطدام التطبيق، في المرحلة التطويرية يمكن تتبع معلومات الإصطدام بالطرق التالية

#1. تشغيل المحاكي، عرض سجلات الأخطاء في Xcode

#2. تتبع الهاتف الحقيقي، عرض سجلات الأخطاء في Xcode

#3. تشغيل الهاتف الحقيقي، عرض سجلات النظام في device

 لإعطاء مثال، أكتب كودًا سيؤدي إلى إصطدامcrashdemo:

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
  [self performSelector:@selector(print) withObject:nil afterDelay:5];
}
- (void)print {
  NSArray *array = @[];
  NSLog(@"%@", array[1]);
}

Demo#1. تشغيل المحاكي، عرض سجلات الأخطاء في Xcode

بعد تنفيذ البرنامج سيحدث إصطدام فوري، يمكنك فتح سجلات النظام في Xcode لرؤية الأخطاء التالية

2016-10-29 12:13:29.015 CrashDemo[37842:7436441] *** تنهية التطبيق بسبب استثناء غير محدد 'NSRangeException'، السبب: '*** -[__NSArray0 objectAtIndex:]: index 1 beyond bounds for empty NSArray'
*** قائمة الاستدعاءات الأولى:
(
  0  CoreFoundation           0x00b7ba84 __exceptionPreprocess + 180
  1  libobjc.A.dylib           0x00642e02 objc_exception_throw + 50
  2  CoreFoundation           0x00b22390 __CFArrayGetTypeID_block_invoke + 0
  3  CoreFoundation           0x00ac07f8 -[NSArray objectAtIndexedSubscript:] + 40
  4  CrashDemo              0x000877b7 -[ViewController print] + 87
  5  Foundation             0x00250d71 __NSFireDelayedPerform + 442
  6  CoreFoundation           0x00acd576 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
  7  CoreFoundation           0x00accf72 __CFRunLoopDoTimer + 1250
  8  CoreFoundation           0x00a8b25a __CFRunLoopRun + 2202
  9  CoreFoundation           0x00a8a706 CFRunLoopRunSpecific + 470
  10 CoreFoundation           0x00a8a51b CFRunLoopRunInMode + 123
  11 GraphicsServices          0x041e4664 GSEventRunModal + 192
  12 GraphicsServices          0x041e44a1 GSEventRun + 104
  13 UIKit                0x00f0c1eb UIApplicationMain + 160
  14 CrashDemo              0x00087bba main + 138
  15 libdyld.dylib            0x03189a21 start + 1
)
libc++abi.dylib: ينتهي التشغيل غير المكتشف الاستثناء من نوع NSException
(lldb) 

من خلال سجلات xcode يمكننا رؤية أن هناك تجاوز حدود في الوصول إلى البنية، ويُدعى طريقة حدوث التجاوز print

بالنسبة لهذا demo نحن بالطبع نعرف أن array[1] التي قمنا بتحديدها هي التي حدثت فيها تجاوز الحدود، لكن كيف يمكننا معرفة مكان حدوث تجاوز الحدود في برنامج كامل؟

في هذه اللحظة يمكننا استخدام ميزة Show the breakpoint navigator الخاصة بـ xcode، النقر على زر plus لتحديد add exception breakpoint

في هذه اللحظة، عند تنفيذ البرنامج، سيقوم xcode بالتوقف تلقائيًا عند السطر الذي سيحدث فيه الانهيار

Demo#2. الت调试 على الهاتف الاصل، عرض سجلات الأخطاء في xcode
إذا تم إضافة نقطة توقيف الاستثناء، فإن البرنامج سيقف تلقائيًا عند سطر طباعة array[1]. إذا لم يتم إضافة أي نقطة توقيف، فإن البرنامج سيقوم بالانهيار، وسيظهر xcode سجلات خطأ كما يلي

2016-10-29 12:15:53.561 CrashDemo[1062:316582] *** تنهي التطبيق بسبب استثناء غير مكتشف 'NSRangeException'، السبب: '*** -[__NSArray0 objectAtIndex:]: index 1 beyond bounds for empty NSArray'
*** قائمة الاستدعاءات الأولى:
(0x211b398b 0x2094ee17 0x211433e7 0xc5a3b 0x219d1ad5 0x211765ff 0x21176231 0x2117407d 0x210c32e9 0x210c30d5 0x226b3ac9 0x257880b9 0xc5c99 0x20d6b873)
libc++abi.dylib: ينتهي التشغيل غير المكتشف الاستثناء من نوع NSException
(lldb) 

من خلال معلومات الخطأ يمكننا رؤية أن هناك زيادة في نطاق الوصول إلى المصفوفة، إذا تم إضافة نقطة توقيف الاستثناء فإنها ستتوقف تلقائيًا عند سطر الخطأ.

 Demo#3. تشغيل على الهاتف الاصل، عرض سجلات النظام للأجهزة

توقف xcode عن تشغيل crashdemo، اختر نافذة xcode - الأجهزة، اختر الهاتف - عرض سجلات الأجهزة

ثم تشغيل crashdemo على الهاتف، في سجلات الأجهزة قم بترتيب الأحداث حسب الوقت لرؤية سجلات التشغيل الأخيرة لـ crashdemo

مُعرف الحدث: 9A4C52F0-B0D7-42C9-A7CB-D4D3321D00D5
مفتاح مُسجل التشغيل: 90f4d3621773443794fa73f506fd6bdef49fc269
نموذج الأجهزة: iPhone4,1
العمليات:       CrashDemo [1074]
المسار:        /private/var/containers/Bundle/Application/1307034E-9C2B-451F-ACD9-04C97DEC047B/CrashDemo.app/CrashDemo
المعرف:     PEGA.CrashDemo
الإصدار:       1 (1.0)
نوع الكود:      ARM (Native)
العمليات الأم:   launchd [1]
التاريخ/الوقت:      2016-10-29 12:21:49.49 +0800
وقت التشغيل:     2016-10-29 12:21:43.43 +0800
إصدار النظام:     iOS 9.3.1 (13E238)
إصدار التقرير:   104
نوع الاستثناء: EXC_CRASH (SIGABRT)
كود الاستثناء: 0x0000000000000000, 0x0000000000000000
ملاحظة الاستثناء: EXC_CORPSE_NOTIFY
تم إطلاق هذا الاستثناء بواسطة Thread: 0
syslog مصفى:
لا توجد نتائج
آخر استثناء التتبع:
0  CoreFoundation          0x211b3986 __exceptionPreprocess + 122
1  libobjc.A.dylib          0x2094ee12 objc_exception_throw + 34
2  CoreFoundation          0x211433e2 -[__NSArray0 objectAtIndex:] + 110
3  CrashDemo             0x000e6a36 0xe0000 + 27190
4  Foundation            0x219d1ad0 __NSFireDelayedPerform + 464
5  CoreFoundation          0x211765fa 

يمكن تنفيذ هذه الأمور بسهولة في مرحلة التطوير، ولكن ماذا إذا حدث تحطم للمستخدم بعد إصدار التطبيق؟ عادةً يمكن للمستخدم فقط إرسال ملاحظات حول ما كان يفعله عندما حدث التحطم

ثم نحاول تجربة ما إذا كان يمكننا مواجهة هذه المشكلة، ولكن هذا غير فعال جدًا وغالبًا ما يكون من الصعب إعادة إنتاج تحطم المستخدم

يحل Bugly هذه المشكلة

يتم إرسال معلومات الخطأ تلقائيًا إلى الخادم عند تحطم البرنامج بواسطة Bugly SDK، مما يسهل على المطورين مراجعة وتحليل الأخطاء

إذن كيف يمكن استخدام Bugly؟

أولاً، قم بزيارة https://bugly.qq.com/v2/ للتسجيل في حساب، ثم سجّل التطبيق لتنزيل SDK

أحضر Bugly.framework إلى المشروع، لا تنسى اختيار copy if needed.

ثم أضف libz.tbd / libstdc++.tbd / Security.framework / SystemConfiguration.framework إلى المشروع

تسجيل في delegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [Bugly startWithAppId:@"إسحب هنا معرف التطبيق الخاص بك"]; 
    return YES; 
 }

بهذا، عند تحطم البرنامج، سيتم إرسال معلومات التحطم تلقائيًا إلى الخادم، ويمكنك التحقق من حساب bugly الخاص بك للحصول على المعلومات

 

 شكرًا على القراءة، آمل أن تكون مفيدًا للجميع، شكرًا لدعمكم لموقعنا!

من المحتمل أن تود