كيف يمكنني تصحيح حادث تحطم عندما أقوم بتشغيل تطبيقي الذي تم جمعه في القمامة في روزيتا؟

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

سؤال

لديّ تطبيق عالمي يستهدف 10.5 ويستخدم جمع القمامة. أقوم ببناء PPC و I386 و X86_64.

ليس لدي إمكانية الوصول إلى جهاز PowerPC المادي ، لذا أحاول استخدام Rosetta لتأكيد أن جزء PowerPC من التطبيق يعمل بشكل صحيح.

ومع ذلك ، بمجرد إطلاق التطبيق في Rosetta ، يتعطل على الفور مع سجل التصادم التالي:

Process:         FooApp [91567]
Path:            /Users/rob/Development/src/FooApp/build/Release 64-bit/FooApp.app/Contents/MacOS/FooApp
Identifier:      com.companyX.FooApp
Version:         0.9 (build d540e05) (2)
Code Type:       PPC (Translated)
Parent Process:  launchd [708]

Date/Time:       2010-04-09 18:32:23.962 +1000
OS Version:      Mac OS X 10.6.3 (10D573)
Report Version:  6

Exception Type:  EXC_CRASH (SIGTRAP)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Crashed Thread:  5

...snip non-relevant threads...

Thread 5 Crashed:
0   libSystem.B.dylib               0x8023656a __pthread_kill + 10
1   libSystem.B.dylib               0x80235e17 pthread_kill + 95
2   com.companyX.FooApp         0xb80bfb30 0xb8000000 + 785200
3   com.companyX.FooApp         0xb80c0037 0xb8000000 + 786487
4   com.companyX.FooApp         0xb80dd8e8 0xb8000000 + 907496
5   com.companyX.FooApp         0xb8145397 spin_lock_wrapper + 1791
6   com.companyX.FooApp         0xb801ceb7 0xb8000000 + 118455

لقد استخدمت مستندات Apple على تطبيقات تصحيح الأخطاء المترجمة والمعلومات على هذه الصفحة لإرفاق GDB بالتطبيق عند تشغيله في Rosetta. ينقسم التطبيق على الفور إلى مصحح الأخطاء عند الإطلاق:

Program received signal SIGTRAP, Trace/breakpoint trap.
[Switching to thread 15107]
0x9151fdd4 in auto_fatal ()
(gdb) bt
#0  0x9151fdd4 in auto_fatal ()
#1  0x91536d84 in Auto::Thread::get_register_state ()
#2  0x915372f8 in Auto::Thread::scan_other_thread ()
#3  0x91529be4 in Auto::Zone::scan_registered_threads ()
#4  0x91539114 in Auto::MemoryScanner::scan_thread_ranges ()
#5  0x9153b000 in Auto::MemoryScanner::scan ()
#6  0x9153049c in Auto::Zone::collect ()
#7  0x915198f4 in auto_collect_internal ()
#8  0x9151a094 in auto_collection_work ()
#9  0x96687434 in _dispatch_call_block_and_release ()
#10 0x9668912c in _dispatch_queue_drain ()
#11 0x96689350 in _dispatch_queue_invoke ()
#12 0x966895c0 in _dispatch_worker_thread2 ()
#13 0x966896fc in _dispatch_worker_thread ()
#14 0x965a97e8 in _pthread_body ()
(gdb) 

ليس لدي أي فكرة من أين أبدأ بهذا. يبدو أن جامع القمامة يفشل بشكل سيء للغاية. هل تطبيقات PowerPC التي تم جمعها القمامة غير مدعومة في روزيتا؟ لا يمكنني رؤية أي ذكر لهذا القيد في المستندات إذا كان الأمر كذلك.

هل لدى أي شخص أي أفكار؟

هل كانت مفيدة؟

المحلول

لقد قررت الآن أنه لا يمكن تشغيل تطبيقات PowerPC التي تم جمعها القمامة باستخدام Rosetta. بعد الحفر في Google ، وجدت بعض الإشارات حول هذا الأمر على قائمة البريد الكاكاو-ديف ، على الرغم من أنه لا يوجد "مسؤول" من Apple.

لقد أكدت أنه حتى تطبيق قالب تطبيق الكاكاو الافتراضي سيتعطل فورًا إذا تم تجميعه لـ PPC مع مجموعة Garbage ثم تم إطلاقه تحت Rosetta.

يجب أن أقول أنه من المحبط للغاية أنه لا يوجد ذكر لهذا القيد في إما إرشادات البرمجة الثنائية العالمية (التي تناقش روزيتا) ، دليل برمجة جمع القمامة أو ملاحظات Appkit Leopard أو Foundation. من المحبط أيضًا أن وقت التشغيل لا يولد نوعًا من رسالة الخطأ المفيدة.

نظرًا لأن Leopard/Rosetta/PowerPC أصبحت الآن "تقنيات Legacy" ، فأنا لا أتخيل أن تقديم خطأ ضد هذا الإغفال سوف يكون جيدًا ، ولكن نأمل أن تساعد هذه الإجابة أولئك الذين يواجهون نفس المشكلة.

نصائح أخرى

إحدى الطرق التي يمكنك من خلالها اختبارها هي تعطيل جامع القمامة عند بدء تطبيقك.

[[NSGarbageCollector defaultCollector] disable];

سوف تتسرب مثل الجنون ، ولكن بالنسبة للاختبار الثانوي ، قد يعمل هذا بشكل جيد. أحد التحذيرات مع هذا هو أنك تحتاج إلى التأكد من أنها واحدة من أول الأشياء التي تحدث في تطبيقك. في main سيكون مكانًا جيدًا ، ولكن إذا ربطت بالأطر التي تعمل فيها +load الطرق (أو لديك مُنشئين) ، قد تحتاج إلى القيام بذلك في الإطار (أو تداخل مكتبة بدلاً من ذلك).

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