التحديث: تمت إعادة تنظيم مكون Xcode الإضافي السابق في حزمة Swift لاستخدامه في تطبيقات أخرى. استخدم منتج Xprobe
في تطبيقات العميل ومنتج XprobeUI
من جانب الخادم.
يمنحك XprobePlugin عرضًا للكائنات داخل تطبيقك إما بالتفصيل وصولاً إلى مستوى ivars أو عالميًا كرسم بياني للكائنات الرئيسية وكيفية اتصالها. يمكن تحريك هذه الشاشة في الوقت الفعلي، مع تسليط الضوء على الكائنات باللون الأحمر أثناء إرسال الرسائل والمسارات التي تتدفق إليها الرسائل. يتم ذلك تلقائيًا عن طريق إجراء "مسح" للعثور على جميع الكائنات المشار إليها بواسطة مجموعة من البذور، والكائنات التي تشير إليها، والكائنات التي تشير إليها وما إلى ذلك لإنشاء قائمة الكائنات الحية التي يمكن عرضها في Xcode :
في جهاز المحاكاة، يتم تحميل كاسحة الذاكرة من حزمة داخل البرنامج الإضافي باستخدام lldb ولا يتطلب أي تغييرات على مصدر مشروع التطبيق. لاستخدام البرنامج المساعد، قم ببناء هذا المشروع وأعد تشغيل Xcode. بمجرد تشغيل التطبيق الخاص بك، استخدم عنصر القائمة "Product/Xprobe/Load" لتحميل العرض الأولي لعملية مسح الذاكرة لتطبيقك. إذا كنت أحد مطوري المكونات الإضافية، فإنك تستخدم "Product/Xprobe/Xcode" لفحص كائنات تطبيق Xcode نفسه.
يمكنك بعد ذلك تصفية الكائنات المدرجة في التطبيق أو أساليبها باستخدام النمط. إذا لم تكن هناك كائنات مطابقة للنمط وكان اسم فئة فسيتم عرضه. ستبحث الأنماط المسبوقة بـ "+" أو "-" في جميع الفئات المرتبطة بالتطبيق عن الأساليب المطابقة للنمط. يمكن إدخال مؤشر أولي مسبوق بـ "0x" لفحص كائن تم تمريره كوسيطة للتتبع. يمكنك أيضًا إدخال كائن "مسار" بدءًا من "البذرة". من المسارات التي تم تسجيلها أثناء تصفح التطبيق الخاص بك حتى تتمكن من العثور على طريق العودة إلى الكائنات بسهولة.
إذا كان لديك البرنامج المساعد حقن فوركس كود مثبتًا، فسيسمح لك Xprobe بتقييم Objective-C أو Swift مقابل مثيل محدد لديك المصدر لتسجيل أو تعديل أي جانب من جوانب حالة الكائن في وقت التشغيل.
يمكن لـ Xprobe.mm الآن لقطة تطبيقك إلى ملف html مستقل في حالة حدوث خطأ. يؤدي هذا إلى إجراء عملية مسح ويمكنه توثيق حالة تطبيقك في وقت حدوث الخطأ لتحليله لاحقًا. يمكن الاطلاع هنا على ملف لقطة نموذجي لمشروع نموذج ReactNative "TickTackToe".
لالتقاط لقطة، قم بتضمين Xprobe.mm في تطبيقك واستخدم الاستدعاء التالي:
[Xprobe snapshot: @" /path/to/snapshot.html.gz " seeds: @[app delegate, rootViewController]];
إذا واجهت صعوبات، فيمكنك تغيير نمط أسماء الفئات حتى لا يتم التقاطه باستخدام وسيطة نمط إضافية باستثناء:(NSString *). القيمة الافتراضية لهذا هي:
@" ^(?:UI|NS((Object|URL|Proxy)$|Text|Layout|Index|.*(Map|Data|Font))|Web|WAK|SwiftObject|XC|IDE|DVT|Xcode3|IB|VK) "
يمكن بسهولة طرح الميزات المتبقية كسلسلة من النقاط:
انقر على رابط الكائن لعرض محتويات ivar الخاصة به.
انقر فوق الارتباط مرة أخرى لإغلاق عرض التفاصيل.
انقر على الرابط superclass لعرض ivars الخاص به
انقر على اسم ivar لتحديث قيمته من التطبيق
انقر على قيمة ivar لتحريرها وتعيين قيمتها في التطبيق
يمكن عرض خصائص الفصل وأساليبه وأي بروتوكولات.
يمكن البحث في قوائم الأساليب (وأيضًا العثور على أساليب الفئة الفائقة)
استخدم رابط "التتبع" لبدء تسجيل المكالمات إلى الأساليب في هذا المثيل.
لرؤية كافة الأساليب التي تم تتبعها لكائن ما، انقر فوق التتبع مقابل كل فئة.
يمكن تصفية إخراج التتبع باستخدام تعبير عادي
سيعرض رابط العروض الفرعية بشكل متكرر شجرة العروض الفرعية ضمن طريقة العرض.
سوف يلتقط رابط "العرض" الصورة عندما يكون الكائن عرضًا.
سيعرض رابط الأشقاء جميع الكائنات الموجودة والتي تشترك في فئة الكائن.
قم بتحديث قائمة الكائنات عن طريق كتابة إدخال في حقل البحث لفرض عملية مسح جديدة.
سيؤدي الضغط على زر الرسم البياني إلى فتح عرض ملخص لأهم الكائنات وأي كائنات "مجموعة" مرتبطة بها مباشرة مأخوذة من عملية المسح الأخيرة.
يتم تمثيل الكائن كمربع إذا كان عرضًا (يستجيب لـ "عروض فرعية".)
يتطلب عرض الرسم البياني تثبيت "Graphviz/dot" على جهاز الكمبيوتر الخاص بك.
انقر فوق كائن لعرض محتوياته الحالية كما تمت مناقشته أعلاه.
يمكن تطبيق تصفية مختلفة للكائنات المراد تضمينها.
"تحريك الرسائل" يضع أثرًا على الكائنات مما يجعلها تظهر باللون الأحمر عند إرسال الرسائل.
يمكن تصدير الرسوم البيانية إلى تنسيق Graphviz أو .png للطباعة.
للأسف، دعم Swift محدود في الوقت الحالي حيث تقوم ivar_getTypeEncoding() بإرجاع NULL لحقول ivar مما يمنعها من المشاركة في "المسح".
يعمل Xprobe عن طريق تحميل حزمة في جهاز المحاكاة والتي تتصل بـ Xcode عند تحميلها. يجعل التطبيق قائمة العقد الأولية الخاصة به معروفة لـ Xprobe من خلال تنفيذ الفئة التالية:
@implementation Xprobe (Seeding)
+ ( NSArray *)xprobeSeeds {
UIApplication *app = [UIApplication sharedApplication ];
NSMutableArray *seeds = [ NSMutableArray arrayWithObject: app];
[seeds addObjectsFromArray: [app windows ]];
// support for cocos2d
Class ccDirectorClass = NSClassFromString ( @" CCDirector " );
CCDirector *ccDirector = [ccDirectorClass sharedDirector ];
if ( ccDirector )
[seeds addObject: ccDirector];
return seeds;
}
@end
أو لنظام التشغيل OSX:
+ ( NSArray *)xprobeSeeds {
NSApplication *app = [ NSApplication sharedApplication ];
NSMutableArray *seeds = [[app windows ] mutableCopy ];
if ( app. delegate )
[seeds insertObject: app.delegate atIndex: 0 ];
return seeds;
}
بمجرد تهيئة التطبيق، اتصل بـ [Xprobe ConnectTo:"your.ip.address" RetainObjects:YES] للاتصال بخادم TCP الذي يعمل داخل Xcode. تحدد الوسيطة RetainObjects: ما إذا كان سيتم الاحتفاظ بالكائنات الموجودة في عملية المسح أم لا. سيؤدي هذا إلى جعل Xprobe أكثر موثوقية ولكنه سيؤثر على دورات حياة الكائن في تطبيقك. بعد ذلك، اتصل بـ [Xprobe search:@""] لإجراء المسح الأولي بدءًا من هذه الكائنات بحثًا عن الكائنات الجذرية. في كل مرة يتم فيها استدعاء "بحث:" أو يتم تغيير مرشح فئة الكائن، يتم إجراء عملية المسح من جديد. يجب إنشاء التطبيق باستخدام Xprobe وXtrace.{h,mm}.
في هذا اليوم وفي عصر المؤشرات "القوية" و"الضعيفة" النظيفة اللطيفة، يبدو المسح موثوقًا للغاية إذا كانت الأشياء مرئية بطريقة أو بأخرى للبذور. بعض الفئات القديمة لا يتم التصرف بشكل جيد وتستخدم خصائص "تعيين" والتي يمكن أن تحتوي على مؤشرات للكائنات غير المخصصة. لتجنب مسح إيفارات هذه الفئات، يحتوي Xprobe على مرشح استبعاد يمكن تجاوزه (مع تحذير) في فئة:
static NSString *swiftPrefix = @" _TtC " ;
@implementation Xprobe (ExclusionOverride)
+ ( BOOL )xprobeExclude:( NSString *)className {
static NSRegularExpression *excluded;
if ( !excluded )
excluded = [ NSRegularExpression xsimpleRegexp: @" ^(_|NS|XC|IDE|DVT|Xcode3|IB|VK|WebHistory) " ];
return [excluded xmatches: className] && ![className hasPrefix: swiftPrefix];
}
@end
تسمح هذه الاستثناءات لـ Xprobe بالعمل بشكل نظيف داخل Xcode نفسه، وهو ما يكون مفيدًا إذا كنت مطورًا للمكونات الإضافية. للحصول على أي اقتراحات أو تعليقات، يمكنك الاتصال بالمؤلف على xprobe على johnholdsworth.com. سيتم الإعلان عن الإصدارات الرئيسية على تويتر @Injection4Xcode.
مع Swift 2.3+، لم يعد Xprobe قادرًا على فحص ivars التي لا تحتوي على خصائص، أي الفئات التي لا ترث من NSObject.
Xprobe.{h,mm} - وظيفة Xprobe الأساسية المطلوبة للقطات IvarAccess.h - الإجراءات المطلوبة للوصول إلى فئة ivars بالاسم Xprobe+Service.mm - خدمة تفاعلية اختيارية تتصل بـ Xcode
حقوق الطبع والنشر (ج) 2014-5 جون هولدسورث. مرخص للتنزيل والتعديل وأي استخدام أثناء تطوير تطبيقات Objectice-C، ولا يجوز إعادة التوزيع إلا من خلال موقع الريبو العام ومع ذلك بما في ذلك إشعار حقوق الطبع والنشر هذا. لإعادة التوزيع الثنائي مع التطبيق الخاص بك، تواصل معنا!
يتضمن هذا الإصدار نسخة معدلة بشكل طفيف جدًا من مكتبة canviz الممتازة لعرض الملفات "النقطة" في لوحة HTML التي تخضع لترخيص MIT. تتمثل التغييرات في المرور عبر معرف العقدة إلى علامة تسمية العقدة (السطر 212)، لعكس عرض العقد والخطوط التي تربطها (السطر 406) وتخزين مسارات الحافة بحيث يمكن تلوينها (السطر 66 و 303) في "canviz-0.1/canviz.js".
وهو يشتمل الآن أيضًا على محرر CodeMirror JavaScript للتعليمات البرمجية التي سيتم تقييمها باستخدام الحقن بموجب ترخيص MIT.
يتم توفير البرنامج "كما هو"، دون أي ضمان من أي نوع، صريحًا أو ضمنيًا، بما في ذلك، على سبيل المثال لا الحصر، ضمانات القابلية للتسويق والملاءمة لغرض معين وعدم الانتهاك. لا يتحمل المؤلفون أو أصحاب حقوق الطبع والنشر بأي حال من الأحوال المسؤولية عن أي مطالبة أو أضرار أو مسؤولية أخرى، سواء في إجراء العقد أو الضرر أو غير ذلك، الناشئة عن أو خارج أو فيما يتعلق بالبرنامج أو الاستخدام أو المعاملات الأخرى في برمجة.