当我在Rosetta中运行我的垃圾回收应用程序时,如何调试崩溃?

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

我使用了苹果文档中有关调试翻译应用程序的内容,以及此页面上的信息,在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) 

我不知道从哪里开始。看起来垃圾回收器出了很大的问题。在Rosetta中不支持垃圾回收的PowerPC应用程序吗?如果是这样,我在文档中没有看到任何关于此限制的提及。

有人有什么想法吗?

2个回答

2
我现在确定垃圾收集的PowerPC应用程序无法使用Rosetta运行。在谷歌上搜索后,我发现了Cocoa-Dev邮件列表中有几个提到这个问题的帖子,尽管没有来自苹果的“官方”说明。
我确认即使是默认的Cocoa应用程序模板应用程序,如果编译为ppc并启用垃圾收集,然后在Rosetta下启动,也会立即崩溃。
我必须说,这种限制在Universal Binary Programming Guidelines(讨论Rosetta)、Garbage Collection Programming Guide或Leopard AppKit或Foundation发布说明中都没有提到,这非常令人沮丧。而且运行时不生成任何有用的错误消息,这也很令人沮丧。
由于Leopard/Rosetta/PowerPC现在是“遗留技术”,我不认为针对这个遗漏问题提交错误报告会有多大作用,但希望这个答案能帮助那些遇到同样问题的人。

谢谢,我也遇到了同样的问题,试图弄清楚为什么Rosetta无法启动我的GC 10.5应用程序。 - the979kid

0

你可以在应用程序启动时禁用垃圾收集器来测试它。

[[NSGarbageCollector defaultCollector] disable];

你会泄漏很多信息,但对于小型测试来说,这可能还可以。但需要注意的是,你需要确保它是应用程序中发生的第一件事情之一。在 main 中是一个好地方,但如果你链接到在 +load 方法中工作的框架(或具有构造函数),则可能需要在框架中执行它(或替换库)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接