Как отлаживаю аварию, когда я бегу своему изготовленным на мусорное ведение приложения в Розетте?
-
25-09-2019 - |
Вопрос
У меня есть универсальное приложение, которое нацеливается на 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 не поддерживаются в Rosetta? Я не вижу никаких упоминаний об этом ограничении в документах, если так.
У кого-нибудь есть идеи?
Решение
Теперь я решил, что собранные на мусорные средства приложения PowerPC не могут работать с помощью Rosetta. После копания в Google я нашел пару упоминаний об этом в списке рассылки Cocoa-Dev, хотя ничего не «чиновника» от Apple.
Я подтвердил, что даже приложение по умолчанию Cocoa шаблон приложения немедленно сократится при компиляции для PPC с сборкой мусора, а затем запущена под Rosetta.
Я должен сказать, что это чрезвычайно расстраивает, что нет упоминания об этом ограничения в либо Универсальные двоичные рекомендации по программированию (который обсуждает Розетту), Руководство по программированию сборки мусора или леопардовые ноты Appkit или Foundation Release. Это также расстраивает, что время выполнения не генерирует какое-то полезное сообщение об ошибке.
Поскольку Leopard / Rosetta / PowerPC теперь «устаревшие технологии», я не представляю, что подает ошибку против этого упущения будет делать много хорошего, но, надеюсь, этот ответ поможет тем, кто придумывает ту же проблему.
Другие советы
Один из способов вы можете проверить, это отключить сборщик мусора при запуске вашего приложения.
[[NSGarbageCollector defaultCollector] disable];
Вы будете утечть как сумасшедшие, но для незначительного теста это может работать хорошо. Одно предостережение с этим вы должны убедиться, что это одна из первых вещей, которые происходят в вашем приложении. В main
будет хорошим местом, но если вы ссылаетесь на рамки, которые работают в +load
Методы (или имеют конструкции), вам может потребоваться сделать это в рамках (или вместо этого вставлять библиотеку).