Как отлаживаю аварию, когда я бегу своему изготовленным на мусорное ведение приложения в Розетте?

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 не поддерживаются в Rosetta? Я не вижу никаких упоминаний об этом ограничении в документах, если так.

У кого-нибудь есть идеи?

Это было полезно?

Решение

Теперь я решил, что собранные на мусорные средства приложения PowerPC не могут работать с помощью Rosetta. После копания в Google я нашел пару упоминаний об этом в списке рассылки Cocoa-Dev, хотя ничего не «чиновника» от Apple.

Я подтвердил, что даже приложение по умолчанию Cocoa шаблон приложения немедленно сократится при компиляции для PPC с сборкой мусора, а затем запущена под Rosetta.

Я должен сказать, что это чрезвычайно расстраивает, что нет упоминания об этом ограничения в либо Универсальные двоичные рекомендации по программированию (который обсуждает Розетту), Руководство по программированию сборки мусора или леопардовые ноты Appkit или Foundation Release. Это также расстраивает, что время выполнения не генерирует какое-то полезное сообщение об ошибке.

Поскольку Leopard / Rosetta / PowerPC теперь «устаревшие технологии», я не представляю, что подает ошибку против этого упущения будет делать много хорошего, но, надеюсь, этот ответ поможет тем, кто придумывает ту же проблему.

Другие советы

Один из способов вы можете проверить, это отключить сборщик мусора при запуске вашего приложения.

[[NSGarbageCollector defaultCollector] disable];

Вы будете утечть как сумасшедшие, но для незначительного теста это может работать хорошо. Одно предостережение с этим вы должны убедиться, что это одна из первых вещей, которые происходят в вашем приложении. В main будет хорошим местом, но если вы ссылаетесь на рамки, которые работают в +load Методы (или имеют конструкции), вам может потребоваться сделать это в рамках (или вместо этого вставлять библиотеку).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top