3

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ドキュメントとこのページの情報を使用して、Rosettaで実行されているときにgdbをアプリにアタッチしました。アプリは起動するとすぐにデバッガーに侵入します。

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でサポートされていませんか?もしそうなら、私はドキュメントでこの制限についての言及を見ることができません。

誰かアイデアはありますか?

4

2 に答える 2

2

ガベージコレクションされたPowerPCアプリはRosettaを使用して実行できないと判断しました。グーグルを調べた後、私はこれについていくつかの言及をCocoa-Devメーリングリストで見つけましたが、Appleからの「公式」なものは何もありません。

ガベージコレクションを使用してppc用にコンパイルし、Rosettaで起動すると、デフォルトのCocoaアプリケーションテンプレートアプリでさえすぐにクラッシュすることを確認しました。

ユニバーサルバイナリプログラミングガイドライン(Rosettaについて説明しています)、ガベージコレクションプログラミングガイド、Leopard AppKitまたはFoundationのリリースノートのいずれにも、この制限についての言及がないことは非常に苛立たしいことです。また、ランタイムが何らかの有用なエラーメッセージを生成しないこともイライラします。

Leopard / Rosetta / PowerPCは現在「レガシーテクノロジー」であるため、この省略に対してバグを報告してもそれほど効果があるとは思いませんが、この回答が同じ問題に直面する人々に役立つことを願っています。

于 2010-04-10T04:03:24.803 に答える
0

テストする方法の1つは、アプリケーションの起動時にガベージコレクターを無効にすることです。

[[NSGarbageCollector defaultCollector] disable];

あなたは狂ったように漏れますが、マイナーなテストではこれはうまくいくかもしれません。これに関する1つの注意点は、それがアプリで最初に発生することの1つであることを確認する必要があるということです。Inmainは良い場所ですが、+loadメソッドで機能する(またはコンストラクターを持つ)フレームワークにリンクする場合は、フレームワークで行う必要がある場合があります(または代わりにライブラリを挿入する必要があります)。

于 2011-04-07T21:47:08.687 に答える