Frage

Ich habe einen Universal-App, die 10,5 zielt und die Garbage Collection verwendet. Ich baue für ppc, i386 und x86_64.

Ich habe keinen Zugriff auf eine physische PowerPC-Maschine so ich versuche Rosetta zu bestätigen zu verwenden, dass der PowerPC Teil der App korrekt funktioniert.

Doch sobald die App in Rosetta gestartet wird es sofort mit dem folgenden Crash-Protokoll stürzt:

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

Ich habe den Apple-docs auf Debuggen übersetzt Apps und die Informationen auf dieser Seite befestigen gdb an die App, wenn es in Rosetta ausgeführt wird. Die App sofort bricht in den Debugger beim Start:

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) 

Ich habe keine Ahnung, wo damit zu beginnen. Es sieht aus wie der Garbage Collector sehr schlecht ausfällt. Sind Garbage Collection PowerPC-Anwendungen nicht in Rosetta unterstützt? Ich kann keine Erwähnung dieser Einschränkung in der Dokumentation sehen, ob so.

Hat jemand irgendwelche Ideen?

War es hilfreich?

Lösung

Ich habe nun festgestellt, dass die Garbage Collection PowerPC-Anwendungen können nicht Rosetta ausgeführt werden. Nach dem Graben in Google mich um finde ein paar auf der Cocoa-Dev Mailing-Liste darüber erwähnt, obwohl nichts „offiziellen“ von Apple.

Ich habe bestätigt, dass auch die Standard-Cocoa-Anwendung Vorlage app sofort abstürzen, wenn für ppc mit Garbage Collection zusammengestellt und dann unter Rosetta gestartet.

Ich muss sagen, es ist extrem frustrierend, dass es keine Erwähnung dieser Einschränkung entweder in der Universal Binary Programmierungs- (die diskutieren Rosetta), die Garbage Collection Programming Guide oder die Leopard AppKit oder Foundation Release Notes. Es ist auch frustrierend, dass die Laufzeit nicht irgendeine Art von nützlicher Fehlermeldung erzeugt.

Als Leopard / Rosetta / PowerPC sind jetzt „Legacy-Technologien“ Ich kann mir nicht vorstellen einen Fehler gegen diese Unterlassung der Einreichung wird viel Gutes tun, aber hoffentlich diese Antwort werden diejenigen, die kommen gegen das gleiche Problem helfen.

Andere Tipps

Eine Möglichkeit, es zu testen ist die Garbage Collector, wenn die Anwendung beginnt zu deaktivieren.

[[NSGarbageCollector defaultCollector] disable];

Sie werden wie verrückt lecken, aber für einen kleineren Test könnte dies in Ordnung arbeiten. Ein Nachteil dabei ist, dass Sie sicherstellen müssen, dass es eines der ersten Dinge, die in Ihrer Anwendung geschieht. In main wäre ein guter Ort sein, aber wenn Sie zu Frameworks verknüpfen, der Arbeit in +load Methoden tun (oder haben Konstrukteure), müssen Sie es im Rahmen tun (oder interpose einer Bibliothek statt).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top